Class BeanKit

java.lang.Object
org.miaixz.bus.core.xyz.BeanKit

public class BeanKit extends Object
Bean工具类

把一个拥有对属性进行set和get方法的类,我们就可以称之为JavaBean

Since:
Java 17+
Author:
Kimi Liu
  • Constructor Details

    • BeanKit

      public BeanKit()
  • Method Details

    • createDynaBean

      public static DynaBean createDynaBean(Object bean)
      创建动态Bean
      Parameters:
      bean - 普通Bean或Map
      Returns:
      DynaBean
    • findEditor

      public static PropertyEditor findEditor(Class<?> type)
      查找类型转换器 PropertyEditor
      Parameters:
      type - 需要转换的目标类型
      Returns:
      PropertyEditor
    • getBeanDesc

      public static StrictBeanDesc getBeanDesc(Class<?> clazz)
      获取StrictBeanDesc Bean描述信息
      Parameters:
      clazz - Bean类
      Returns:
      StrictBeanDesc
    • descForEach

      public static void descForEach(Class<?> clazz, Consumer<? super PropDesc> action)
      遍历Bean的属性
      Parameters:
      clazz - Bean类
      action - 每个元素的处理类
    • getPropertyDescriptors

      public static PropertyDescriptor[] getPropertyDescriptors(Class<?> clazz) throws BeanException
      获得Bean字段描述数组
      Parameters:
      clazz - Bean类
      Returns:
      字段描述数组
      Throws:
      BeanException - 获取属性异常
    • getPropertyDescriptorMap

      public static Map<String,PropertyDescriptor> getPropertyDescriptorMap(Class<?> clazz, boolean ignoreCase) throws BeanException
      获得字段名和字段描述Map,获得的结果会缓存在 BeanInfoCache
      Parameters:
      clazz - Bean类
      ignoreCase - 是否忽略大小写
      Returns:
      字段名和字段描述Map
      Throws:
      BeanException - 获取属性异常
    • getPropertyDescriptor

      public static PropertyDescriptor getPropertyDescriptor(Class<?> clazz, String fieldName) throws BeanException
      获得Bean类属性描述,大小写敏感
      Parameters:
      clazz - Bean类
      fieldName - 字段名
      Returns:
      PropertyDescriptor
      Throws:
      BeanException - 获取属性异常
    • getPropertyDescriptor

      public static PropertyDescriptor getPropertyDescriptor(Class<?> clazz, String fieldName, boolean ignoreCase) throws BeanException
      获得Bean类属性描述
      Parameters:
      clazz - Bean类
      fieldName - 字段名
      ignoreCase - 是否忽略大小写
      Returns:
      PropertyDescriptor
      Throws:
      BeanException - 获取属性异常
    • getFieldValue

      public static Object getFieldValue(Object bean, String fieldNameOrIndex)
      获得字段值,通过反射直接获得字段值,并不调用getXXX方法 对象同样支持Map类型,fieldNameOrIndex即为key
      • Map: fieldNameOrIndex需为key,获取对应value
      • Collection: fieldNameOrIndex当为数字,返回index对应值,非数字遍历集合返回子bean对应name值
      • Array: fieldNameOrIndex当为数字,返回index对应值,非数字遍历数组返回子bean对应name值
      Parameters:
      bean - Bean对象
      fieldNameOrIndex - 字段名或序号,序号支持负数
      Returns:
      字段值
    • setFieldValue

      public static Object setFieldValue(Object bean, String fieldNameOrIndex, Object value)
      设置字段值,通过反射设置字段值,并不调用setXXX方法 对象同样支持Map类型,fieldNameOrIndex即为key,支持:
      • Map
      • List
      • Bean
      Parameters:
      bean - Bean
      fieldNameOrIndex - 字段名或序号,序号支持负数
      value - 值
      Returns:
      beans,当为数组时,返回一个新的数组
    • getProperty

      public static <T> T getProperty(Object bean, String expression)
      获取Bean中的属性值
      Type Parameters:
      T - 属性值类型
      Parameters:
      bean - Bean对象,支持Map、List、Collection、Array
      expression - 表达式,例如:person.friend[5].name
      Returns:
      Bean属性值,bean为null或者express为空,返回null
      See Also:
    • setProperty

      public static void setProperty(Object bean, String expression, Object value)
      设置Bean中的属性值
      Parameters:
      bean - Bean对象,支持Map、List、Collection、Array
      expression - 表达式,例如:person.friend[5].name
      value - 属性值
      See Also:
    • toBean

      public static <T> T toBean(Object source, Class<T> clazz)
      对象或Map转Bean
      Type Parameters:
      T - 转换的Bean类型
      Parameters:
      source - Bean对象或Map
      clazz - 目标的Bean类型
      Returns:
      Bean对象
    • toBean

      public static <T> T toBean(Object source, Class<T> clazz, CopyOptions options)
      对象或Map转Bean
      Type Parameters:
      T - 转换的Bean类型
      Parameters:
      source - Bean对象或Map
      clazz - 目标的Bean类型
      options - 属性拷贝选项
      Returns:
      Bean对象
    • toBean

      public static <T> T toBean(Object source, Supplier<T> targetSupplier, CopyOptions options)
      对象或Map转Bean
      Type Parameters:
      T - 转换的Bean类型
      Parameters:
      source - Bean对象或Map或ValueProvider
      targetSupplier - 目标的Bean创建器
      options - 属性拷贝选项
      Returns:
      Bean对象
    • fillBean

      public static <T> T fillBean(T bean, ValueProvider<String> valueProvider, CopyOptions copyOptions)
      填充Bean的核心方法
      Type Parameters:
      T - Bean类型
      Parameters:
      bean - Bean
      valueProvider - 值提供者
      copyOptions - 拷贝选项,见 CopyOptions
      Returns:
      Bean
    • fillBeanWithMap

      public static <T> T fillBeanWithMap(Map<?,?> map, T bean, CopyOptions copyOptions)
      使用Map填充Bean对象
      Type Parameters:
      T - Bean类型
      Parameters:
      map - Map
      bean - Bean
      copyOptions - 属性复制选项 CopyOptions
      Returns:
      Bean
    • beanToMap

      public static Map<String,Object> beanToMap(Object bean, String... properties)
      将bean的部分属性转换成map 可选拷贝哪些属性值,默认是不忽略值为null的值的。
      Parameters:
      bean - beans
      properties - 需要拷贝的属性值,null或空表示拷贝所有值
      Returns:
      Map
    • beanToMap

      public static Map<String,Object> beanToMap(Object bean, boolean isToUnderlineCase, boolean ignoreNullValue)
      对象转Map
      Parameters:
      bean - bean对象
      isToUnderlineCase - 是否转换为下划线模式
      ignoreNullValue - 是否忽略值为空的字段
      Returns:
      Map
    • beanToMap

      public static Map<String,Object> beanToMap(Object bean, Map<String,Object> targetMap, boolean isToUnderlineCase, boolean ignoreNullValue)
      对象转Map
      Parameters:
      bean - bean对象
      targetMap - 目标的Map
      isToUnderlineCase - 是否转换为下划线模式
      ignoreNullValue - 是否忽略值为空的字段
      Returns:
      Map
    • beanToMap

      public static Map<String,Object> beanToMap(Object bean, Map<String,Object> targetMap, boolean ignoreNullValue, UnaryOperator<MutableEntry<String,Object>> keyEditor)
      对象转Map 通过实现UnaryOperator 可以自定义字段值,如果这个Editor返回null则忽略这个字段,以便实现:
       1. 字段筛选,可以去除不需要的字段
       2. 字段变换,例如实现驼峰转下划线
       3. 自定义字段前缀或后缀等等
       
      Parameters:
      bean - bean对象
      targetMap - 目标的Map
      ignoreNullValue - 是否忽略值为空的字段
      keyEditor - 属性字段(Map的key)编辑器,用于筛选、编辑key,如果这个Editor返回null则忽略这个字段
      Returns:
      Map
    • beanToMap

      public static Map<String,Object> beanToMap(Object bean, Map<String,Object> targetMap, CopyOptions copyOptions)
      对象转Map 通过自定义CopyOptions 完成抓换选项,以便实现:
       1. 字段筛选,可以去除不需要的字段
       2. 字段变换,例如实现驼峰转下划线
       3. 自定义字段前缀或后缀等等
       4. 字段值处理
       ...
       
      Parameters:
      bean - bean对象
      targetMap - 目标的Map
      copyOptions - 拷贝选项
      Returns:
      Map
    • copyProperties

      public static <T> T copyProperties(Object source, Class<T> tClass, String... ignoreProperties)
      按照Bean对象属性创建对应的Class对象,并忽略某些属性
      Type Parameters:
      T - 对象类型
      Parameters:
      source - 源Bean对象
      tClass - 目标Class
      ignoreProperties - 不拷贝的的属性列表
      Returns:
      目标对象
    • copyProperties

      public static <T> T copyProperties(Object source, T target, String... ignoreProperties)
      复制Bean对象属性 限制类用于限制拷贝的属性,例如一个类我只想复制其父类的一些属性,就可以将editable设置为父类
      Type Parameters:
      T - 目标类型
      Parameters:
      source - 源Bean对象
      target - 目标Bean对象
      ignoreProperties - 不拷贝的的属性列表
      Returns:
      目标对象
    • copyProperties

      public static <T> T copyProperties(Object source, T target, boolean ignoreCase)
      复制Bean对象属性
      Type Parameters:
      T - 目标类型
      Parameters:
      source - 源Bean对象
      target - 目标Bean对象
      ignoreCase - 是否忽略大小写
      Returns:
      目标对象
    • copyProperties

      public static <T> T copyProperties(Object source, T target, CopyOptions copyOptions)
      复制Bean对象属性 限制类用于限制拷贝的属性,例如一个类我只想复制其父类的一些属性,就可以将editable设置为父类
      Type Parameters:
      T - 目标类型
      Parameters:
      source - 源Bean对象
      target - 目标Bean对象
      copyOptions - 拷贝选项,见 CopyOptions
      Returns:
      目标对象
    • copyToList

      public static <T> List<T> copyToList(Collection<?> collection, Class<T> targetType)
      复制集合中的Bean属性 此方法遍历集合中每个Bean,复制其属性后加入一个新的List中。
      Type Parameters:
      T - Bean类型
      Parameters:
      collection - 原Bean集合
      targetType - 目标Bean类型
      Returns:
      复制后的List
    • copyToList

      public static <T> List<T> copyToList(Collection<?> collection, Class<T> targetType, CopyOptions copyOptions)
      复制集合中的Bean属性 此方法遍历集合中每个Bean,复制其属性后加入一个新的List中。
      Type Parameters:
      T - Bean类型
      Parameters:
      collection - 原Bean集合
      targetType - 目标Bean类型
      copyOptions - 拷贝选项
      Returns:
      复制后的List
    • isMatchName

      public static boolean isMatchName(Object bean, String beanClassName, boolean isSimple)
      给定的Bean的类名是否匹配指定类名字符串 如果isSimple为true,则只匹配类名而忽略包名,例如:org.miaixz.TestEntity只匹配TestEntity 如果isSimple为false,则匹配包括包名的全类名,例如:org.miaixz.TestEntity匹配org.miaixz.TestEntity
      Parameters:
      bean - Bean
      beanClassName - Bean的类名
      isSimple - 是否只匹配类名而忽略包名,true表示忽略包名
      Returns:
      是否匹配
    • edit

      public static <T> T edit(T bean, UnaryOperator<Field> editor)
      编辑Bean的字段,static字段不会处理 例如需要对指定的字段做判空操作、null转""操作等等。
      Type Parameters:
      T - 被编辑的Bean类型
      Parameters:
      bean - beans
      editor - 编辑器函数
      Returns:
      beans
    • trimStringField

      public static <T> T trimStringField(T bean, String... ignoreField)
      把Bean里面的String属性做trim操作。此方法直接对传入的Bean做修改。 通常bean直接用来绑定页面的input,用户的输入可能首尾存在空格,通常保存数据库前需要把首尾空格去掉
      Type Parameters:
      T - Bean类型
      Parameters:
      bean - Bean对象
      ignoreField - 不需要trim的Field名称列表(不区分大小写)
      Returns:
      处理后的Bean对象
    • isEmpty

      public static boolean isEmpty(Object bean, String... ignoreFieldNames)
      判断Bean是否为空对象,空对象表示本身为null或者所有属性都为null 此方法不判断static属性
      Parameters:
      bean - Bean对象
      ignoreFieldNames - 忽略检查的字段名
      Returns:
      是否为空,true - 空 / false - 非空
    • isNotEmpty

      public static boolean isNotEmpty(Object bean, String... ignoreFieldNames)
      判断Bean是否为非空对象,非空对象表示本身不为null或者含有非null属性的对象
      Parameters:
      bean - Bean对象
      ignoreFieldNames - 忽略检查的字段名
      Returns:
      是否为非空,true - 非空 / false - 空
    • isReadableBean

      public static boolean isReadableBean(Class<?> clazz)
      判断是否为可读的Bean对象,判定方法是:
           1、是否存在只有无参数的getXXX方法或者isXXX方法
           2、是否存在public类型的字段
       
      Parameters:
      clazz - 待测试类
      Returns:
      是否为可读的Bean对象
      See Also:
    • isWritableBean

      public static boolean isWritableBean(Class<?> clazz)
      判断是否为可写Bean对象,判定方法是:
           1、是否存在只有一个参数的setXXX方法
           2、是否存在public类型的字段
       
      Parameters:
      clazz - 待测试类
      Returns:
      是否为Bean对象
      See Also:
    • hasSetter

      public static boolean hasSetter(Class<?> clazz)
      判断是否有Setter方法 判定方法是否存在只有一个参数的setXXX方法
      Parameters:
      clazz - 待测试类
      Returns:
      是否为Bean对象
    • hasGetter

      public static boolean hasGetter(Class<?> clazz)
      判断是否为Bean对象 判定方法是否存在只有无参数的getXXX方法或者isXXX方法
      Parameters:
      clazz - 待测试类
      Returns:
      是否为Bean对象
    • hasPublicField

      public static boolean hasPublicField(Class<?> clazz)
      指定类中是否有public类型字段(static字段除外)
      Parameters:
      clazz - 待测试类
      Returns:
      是否有public类型字段
    • hasNullField

      public static boolean hasNullField(Object bean, String... ignoreFieldNames)
      判断Bean是否包含值为null的属性 对象本身为null也返回true
      Parameters:
      bean - Bean对象
      ignoreFieldNames - 忽略检查的字段名
      Returns:
      是否包含值为null的属性,true - 包含 / false - 不包含
    • hasEmptyField

      public static boolean hasEmptyField(Object bean, String... ignoreFieldNames)
      判断Bean是否包含值为null的属性,或当字段为CharSequence时,是否为isEmpty(null或"") 对象本身为null也返回true
      Parameters:
      bean - Bean对象
      ignoreFieldNames - 忽略检查的字段名
      Returns:
      是否包含值为null的属性,true - 包含 / false - 不包含
    • checkBean

      public static boolean checkBean(Object bean, Predicate<Field> predicate)
      检查Bean 遍历Bean的字段并断言检查字段,当某个字段: 断言为true 时,返回true并不再检查后续字段; 断言为false时,继续检查后续字段
      Parameters:
      bean - Bean
      predicate - 断言
      Returns:
      是否触发断言为真
    • getFieldName

      public static String getFieldName(String getterOrSetterName)
      获取Getter或Setter方法名对应的字段名称,规则如下:
      • getXxxx获取为xxxx,如getName得到name。
      • setXxxx获取为xxxx,如setName得到name。
      • isXxxx获取为xxxx,如isName得到name。
      • 其它不满足规则的方法名抛出IllegalArgumentException
      Parameters:
      getterOrSetterName - Getter或Setter方法名
      Returns:
      字段名称
      Throws:
      IllegalArgumentException - 非Getter或Setter方法