org.redkale.util

## 接口 Attribute<T,F>

- 类型参数:
    `T` - 字段依附的类
    `F` - 字段的数据类型
  所有已知实现类:
    DataCallArrayAttribute, DataCallAttribute

      public interface Attribute<T,F>

  该类实现动态映射一个JavaBean类中成员对应的getter、setter方法； 代替低效的反射实现方式。

  >       public class Record {

  >           private String name;

  >           public String getName() {
  >               return name;
  >           }

  >           public void setName(String name) {
  >               this.name = name;
  >           }
  >       }

  获取name的 Attribute ：

  >       Attribute<Record, String> nameAction = Attribute.create(Record.class.getDeclaredField("name"));

  等价于:

  >       Attribute<Record, String> nameAction = new Attribute<Record, String>() {

  >           @Override
  >           public String field() {
  >               return "name";
  >           }

  >           @Override
  >           public String get(Record obj) {
  >               return obj.getName();
  >           }

  >           @Override
  >           public void set(Record obj, String value) {
  >               obj.setName(value);
  >           }

  >           @Override
  >           public Class type() {
  >               return String.class;
  >           }

  >           @Override
  >           public Class declaringClass() {
  >               return Record.class;
  >           }
  >       };

  映射Field时，field必须满足以下条件之一：
  1、field属性是public且非final
  2、至少存在对应的getter、setter方法中的一个
  当不存在getter方法时，get操作固定返回null
  当不存在setter方法时，set操作为空方法

  详情见: https://redkale.org

- - ### 方法概要

    所有方法 静态方法 实例方法 抽象方法 默认方法
    限定符和类型 | 方法和说明
    --- | ---
    `static <T> Attribute<T,?>[]` | `create(java.lang.Class<T> clazz)` 根据Class生成getter、setter方法都存在的字段对应的 Attribute 对象数组。
    `static <T,F> Attribute<T,F>` | `create(java.lang.Class<T> clazz, java.lang.reflect.Field field)` 根据一个Class和Field生成 Attribute 对象。
    `static <T,F> Attribute<T,F>` | `create(java.lang.Class<T> clazz, java.lang.reflect.Method getter, java.lang.reflect.Method setter)` 根据Class、getter和setter方法生成 Attribute 对象。
    `static <T,F> Attribute<T,F>` | `create(java.lang.Class<T> clazz, java.lang.String fieldname)` 根据一个Class和field真实名称生成 Attribute 对象。
    `static <T,F> Attribute<T,F>` | `create(java.lang.Class<T> clazz, java.lang.String fieldalias, java.lang.Class<F> fieldtype)` 根据Class、字段别名、字段类型生成虚构的 Attribute 对象,get、set方法为空方法。
    `static <T,F> Attribute<T,F>` | `create(java.lang.Class<T> clazz, java.lang.String fieldalias, java.lang.Class<F> fieldtype, java.lang.reflect.Field field, java.lang.reflect.Method getter, java.lang.reflect.Method setter)` 根据Class、字段别名、字段类型、Field、getter和setter方法生成 Attribute 对象。
    `static <T,F> Attribute<T,F>` | `create(java.lang.Class<T> clazz, java.lang.String fieldname, java.lang.Class<F> fieldtype, java.util.function.Function<T,F> getter, java.util.function.BiConsumer<T,F> setter)` 根据Class、字段名、字段类型、getter和setter方法生成 Attribute 对象。
    `static <T,F> Attribute<T,F>` | `create(java.lang.Class<T> clazz, java.lang.String fieldalias, java.lang.reflect.Field field)` 根据一个Class、field别名和Field生成 Attribute 对象。
    `static <T,F> Attribute<T,F>` | `create(java.lang.Class<T> clazz, java.lang.String fieldalias, java.lang.reflect.Field field, java.lang.reflect.Method getter, java.lang.reflect.Method setter)` 根据Class、字段别名、Field、getter和setter方法生成 Attribute 对象。
    `static <T,F> Attribute<T,F>` | `create(java.lang.Class<T> clazz, java.lang.String fieldalias, java.lang.reflect.Method getter, java.lang.reflect.Method setter)` 根据Class、字段别名、getter和setter方法生成 Attribute 对象。
    `static <T,F> Attribute<T,F>` | `create(java.lang.reflect.Field field)` 根据一个Field生成 Attribute 对象。
    `static <T,F> Attribute<T,F>` | `create(java.lang.reflect.Method getter, java.lang.reflect.Method setter)` 根据一个getter和setter方法生成 Attribute 对象。
    `static <T,F> Attribute<T,F>` | `create(java.lang.String fieldalias, java.lang.reflect.Field field)` 根据一个Field和field的别名生成 Attribute 对象。
    `static <T> Attribute<T,?>[]` | `createGetters(java.lang.Class<T> clazz)` 根据Class生成getter方法对应的 Attribute 对象数组。
    `static <T> Attribute<T,?>[]` | `createSetters(java.lang.Class<T> clazz)` 根据Class生成setter方法对应的 Attribute 对象数组。
    `java.lang.Class<T>` | `declaringClass()` 返回字段依附的类名
    `java.lang.String` | `field()` 返回字段名
    `F` | `get(T obj)` 获取指定对象的该字段的值
    `void` | `set(T obj, F value)` 给指定对象的该字段赋值
    `java.lang.Class<? extends F>` | `type()` 返回字段的数据类型

- - ### 方法详细资料

    - #### type

          java.lang.Class<? extends F> type()

      返回字段的数据类型
      返回:
        字段的数据类型

    - #### declaringClass

          java.lang.Class<T> declaringClass()

      返回字段依附的类名
      返回:
        依附的类名

    - #### field

          java.lang.String field()

      返回字段名
      返回:
        字段名

    - #### get

          F get(T obj)

      获取指定对象的该字段的值
      参数:
        `obj` - 指定对象
      返回:
        字段的值

    - #### set

          void set(T obj,
                   F value)

      给指定对象的该字段赋值
      参数:
        `obj` - 指定对象
        `value` - 字段新值

    - #### create

          static <T,F> Attribute<T,F> create(java.lang.reflect.Field field)

      根据一个Field生成 Attribute 对象。
      类型参数:
        `T` - 依附类的类型
        `F` - 字段类型
      参数:
        `field` - 字段，如果该字段不存在则抛异常
      返回:
        Attribute对象

    - #### create

          static <T,F> Attribute<T,F> create(java.lang.String fieldalias,
                                             java.lang.reflect.Field field)

      根据一个Field和field的别名生成 Attribute 对象。
      类型参数:
        `T` - 依附类的类型
        `F` - 字段类型
      参数:
        `fieldalias` - 别名
        `field` - 字段，如果该字段不存在则抛异常
      返回:
        Attribute对象

    - #### create

          static <T,F> Attribute<T,F> create(java.lang.Class<T> clazz,
                                             java.lang.String fieldname)

      根据一个Class和field真实名称生成 Attribute 对象。
      类型参数:
        `T` - 依附类的类型
        `F` - 字段类型
      参数:
        `clazz` - 指定依附的类
        `fieldname` - 字段名，如果该字段不存在则抛异常
      返回:
        Attribute对象

    - #### create

          static <T,F> Attribute<T,F> create(java.lang.Class<T> clazz,
                                             java.lang.reflect.Field field)

      根据一个Class和Field生成 Attribute 对象。
      类型参数:
        `T` - 依附类的类型
        `F` - 字段类型
      参数:
        `clazz` - 指定依附的类
        `field` - 字段，如果该字段不存在则抛异常
      返回:
        Attribute对象

    - #### create

          static <T,F> Attribute<T,F> create(java.lang.Class<T> clazz,
                                             java.lang.String fieldalias,
                                             java.lang.reflect.Field field)

      根据一个Class、field别名和Field生成 Attribute 对象。
      类型参数:
        `T` - 依附类的类型
        `F` - 字段类型
      参数:
        `clazz` - 指定依附的类
        `fieldalias` - 字段别名
        `field` - 字段，如果该字段不存在则抛异常
      返回:
        Attribute对象

    - #### create

          static <T,F> Attribute<T,F> create(java.lang.reflect.Method getter,
                                             java.lang.reflect.Method setter)

      根据一个getter和setter方法生成 Attribute 对象。 tgetter、setter不能同时为null
      类型参数:
        `T` - 依附类的类型
        `F` - 字段类型
      参数:
        `getter` - getter方法
        `setter` - setter方法
      返回:
        Attribute对象

    - #### create

          static <T,F> Attribute<T,F> create(java.lang.Class<T> clazz,
                                             java.lang.reflect.Method getter,
                                             java.lang.reflect.Method setter)

      根据Class、getter和setter方法生成 Attribute 对象。 tgetter、setter不能同时为null
      类型参数:
        `T` - 依附类的类型
        `F` - 字段类型
      参数:
        `clazz` - 指定依附的类
        `getter` - getter方法
        `setter` - setter方法
      返回:
        Attribute对象

    - #### create

          static <T> Attribute<T,?>[] create(java.lang.Class<T> clazz)

      根据Class生成getter、setter方法都存在的字段对应的 Attribute 对象数组。
      类型参数:
        `T` - 依附类的类型
      参数:
        `clazz` - 指定依附的类
      返回:
        Attribute对象数组

    - #### createGetters

          static <T> Attribute<T,?>[] createGetters(java.lang.Class<T> clazz)

      根据Class生成getter方法对应的 Attribute 对象数组。
      类型参数:
        `T` - 依附类的类型
      参数:
        `clazz` - 指定依附的类
      返回:
        Attribute对象数组

    - #### createSetters

          static <T> Attribute<T,?>[] createSetters(java.lang.Class<T> clazz)

      根据Class生成setter方法对应的 Attribute 对象数组。
      类型参数:
        `T` - 依附类的类型
      参数:
        `clazz` - 指定依附的类
      返回:
        Attribute对象数组

    - #### create

          static <T,F> Attribute<T,F> create(java.lang.Class<T> clazz,
                                             java.lang.String fieldalias,
                                             java.lang.reflect.Method getter,
                                             java.lang.reflect.Method setter)

      根据Class、字段别名、getter和setter方法生成 Attribute 对象。 tgetter、setter不能同时为null
      类型参数:
        `T` - 依附类的类型
        `F` - 字段类型
      参数:
        `clazz` - 指定依附的类
        `fieldalias` - 字段别名
        `getter` - getter方法
        `setter` - setter方法
      返回:
        Attribute对象

    - #### create

          static <T,F> Attribute<T,F> create(java.lang.Class<T> clazz,
                                             java.lang.String fieldalias,
                                             java.lang.reflect.Field field,
                                             java.lang.reflect.Method getter,
                                             java.lang.reflect.Method setter)

      根据Class、字段别名、Field、getter和setter方法生成 Attribute 对象。 Field、tgetter、setter不能同时为null
      类型参数:
        `T` - 依附类的类型
        `F` - 字段类型
      参数:
        `clazz` - 指定依附的类
        `fieldalias` - 字段别名
        `field` - 字段
        `getter` - getter方法
        `setter` - setter方法
      返回:
        Attribute对象

    - #### create

          static <T,F> Attribute<T,F> create(java.lang.Class<T> clazz,
                                             java.lang.String fieldalias,
                                             java.lang.Class<F> fieldtype)

      根据Class、字段别名、字段类型生成虚构的 Attribute 对象,get、set方法为空方法。
      类型参数:
        `T` - 依附类的类型
        `F` - 字段类型
      参数:
        `clazz` - 指定依附的类
        `fieldalias` - 字段别名
        `fieldtype` - 字段的类
      返回:
        Attribute对象

    - #### create

          static <T,F> Attribute<T,F> create(java.lang.Class<T> clazz,
                                             java.lang.String fieldalias,
                                             java.lang.Class<F> fieldtype,
                                             java.lang.reflect.Field field,
                                             java.lang.reflect.Method getter,
                                             java.lang.reflect.Method setter)

      根据Class、字段别名、字段类型、Field、getter和setter方法生成 Attribute 对象。 fieldalias/fieldtype、Field、tgetter、setter不能同时为null.
      类型参数:
        `T` - 依附类的类型
        `F` - 字段类型
      参数:
        `clazz` - 指定依附的类
        `fieldalias` - 字段别名
        `fieldtype` - 字段类型
        `field` - 字段
        `getter` - getter方法
        `setter` - setter方法
      返回:
        Attribute对象

    - #### create

          static <T,F> Attribute<T,F> create(java.lang.Class<T> clazz,
                                             java.lang.String fieldname,
                                             java.lang.Class<F> fieldtype,
                                             java.util.function.Function<T,F> getter,
                                             java.util.function.BiConsumer<T,F> setter)

      根据Class、字段名、字段类型、getter和setter方法生成 Attribute 对象。 clazz、fieldname、fieldtype都不能为null
      类型参数:
        `T` - 依附类的类型
        `F` - 字段类型
      参数:
        `clazz` - 指定依附的类
        `fieldname` - 字段名
        `fieldtype` - 字段类型
        `getter` - getter方法
        `setter` - setter方法
      返回:
        Attribute对象