Class Pojos

java.lang.Object
cn.xuanyuanli.core.util.Pojos

public class Pojos extends Object
Java对象映射(属性复制)工具。

字段名映射规则:

  1. 驼峰命名和下划线命名可以完成自动转换并赋值。
    例如:A对象到B对象,A中有user_type字段,B中有userType,可以完成user_type -> userType的字段赋值;
    同理,也可以完成userType -> user_type的赋值。
  2. 支持父类属性的获取和赋值。
  3. 所谓的字段名,其实是属性:对于源对象,指的是get方法;对于目标对象来说,指的是set方法。

属性类型赋值规则:

  1. 如果类型相同,则复制。
  2. 如果类型不同,且都为基本类型,可以完成自动转换赋值,例如int到string,string到double等。
  3. 如果类型不同,且不为基本类型,不能进行自动转换赋值。
  4. 如果类型为集合,且集合泛型相同,可以完成自动赋值。
  5. 如果类型为集合,且集合泛型不同,不能完成自动赋值(存在泛型消除问题,可以理解为不能自动赋值)。

使用说明:

  1. 优先使用vo2dto插件。
  2. 其次,必须在Jujube-Ext插件的配合下使用,此插件带有类复制检测。
  3. 不允许非上述场景下使用,容易造成潜在问题。

性能报告:

  1. 参考PojosBenchmark的测试结果:BeanCopier的性能接近原始get set操作,getBeanCopierFromCache的性能是其1/4
  2. IntelliJ Profiler对于PojosTests#mappingRecordPrimitiveToWrap_multiple()方法的测试结果
    • getBeanCopierFromCache()方法占用了94%,其中字符串拼接占用了35%,ConcurrentHashMap#computeIfAbsent()占用了65%
    • BeanCopier的性能是没有问题,主要耗时在getBeanCopierFromCache()方法
Since:
2021/09/01
Author:
John Li
  • Field Details

  • Constructor Details

    • Pojos

      public Pojos()
  • Method Details

    • mapping

      public static <T> T mapping(Object sourceObj, Class<T> destClass)
      把原始对象映射为对应类型的Pojo
      Type Parameters:
      T - 泛型
      Parameters:
      sourceObj - 源obj
      destClass - 目标类
      Returns:
      Pojos
    • mapping

      public static <T> T mapping(Object sourceObj, Class<T> destClass, Pojos.FieldMapping fieldMapping)
      把原始对象映射为对应类型的Pojo
      Type Parameters:
      T - 泛型
      Parameters:
      sourceObj - 源obj
      destClass - 目标类
      fieldMapping - 字段映射
      Returns:
      Pojos
    • getBeanCopierFromCache

      public static BeanCopier getBeanCopierFromCache(Object sourceObj, Class<?> destClass, Pojos.FieldMapping fieldMapping, boolean cover)
      获得bean复制者
      Parameters:
      sourceObj - 源obj
      destClass - 桌子类
      fieldMapping - 字段映射
      cover - 封面
      Returns:
      BeanCopier
    • getRowKey

      private static TreeSet<?> getRowKey(Object sourceObj)
    • getRealBeanCopier

      private static BeanCopier getRealBeanCopier(Object sourceObj, Class<?> destClass, boolean cover, Pojos.FieldMapping fieldMapping)
      获取真正bean复印机
      Parameters:
      sourceObj - 来源obj
      destClass - dest类
      cover - 覆盖
      fieldMapping - 字段映射
      Returns:
      BeanCopier
    • getFieldNameList

      private static List<String> getFieldNameList(Object sourceObj)
      获得字段名称集合
      Parameters:
      sourceObj - 源obj
      Returns:
      Listinvalid input: '<'String>
    • copy

      public static void copy(Object sourceObj, Object destObj, boolean cover)
      复制一个对象的值到另一个对象
      Parameters:
      sourceObj - 源obj
      destObj - obj不在座位上
      cover - 是否覆盖destObj字段的值。
      如果为true,则sourceObj对应字段值会覆盖destObj中对应字段值(不论sourceObj值为空或不为空)
      如果为false,则destObj值不为空则不覆盖,为空则覆盖
    • copy

      public static void copy(Object sourceObj, Object destObj)
      复制
      Parameters:
      sourceObj - 源obj
      destObj - obj不在座位上
      See Also:
    • mappingArray

      public static <T> List<T> mappingArray(List<?> source, Class<T> class1)
      把原始对象集合映射为对应类型的Pojo集合
      Type Parameters:
      T - 泛型
      Parameters:
      source - 源
      class1 - class1
      Returns:
      Listinvalid input: '<'Pojos>
    • mappingArray

      public static <T> List<T> mappingArray(List<?> source, Class<T> destClass, Pojos.FieldMapping fieldMapping)
      把原始对象集合映射为对应类型的Pojo集合
      Type Parameters:
      T - 泛型
      Parameters:
      source - 源
      destClass - 桌子类
      fieldMapping - 字段映射
      Returns:
      Listinvalid input: '<'Pojos>