Package cn.xuanyuanli.core.util
Class Pojos
java.lang.Object
cn.xuanyuanli.core.util.Pojos
Java对象映射(属性复制)工具。
字段名映射规则:
- 驼峰命名和下划线命名可以完成自动转换并赋值。
例如:A对象到B对象,A中有user_type字段,B中有userType,可以完成user_type -> userType的字段赋值;
同理,也可以完成userType -> user_type的赋值。 - 支持父类属性的获取和赋值。
- 所谓的字段名,其实是属性:对于源对象,指的是get方法;对于目标对象来说,指的是set方法。
属性类型赋值规则:
- 如果类型相同,则复制。
- 如果类型不同,且都为基本类型,可以完成自动转换赋值,例如int到string,string到double等。
- 如果类型不同,且不为基本类型,不能进行自动转换赋值。
- 如果类型为集合,且集合泛型相同,可以完成自动赋值。
- 如果类型为集合,且集合泛型不同,不能完成自动赋值(存在泛型消除问题,可以理解为不能自动赋值)。
使用说明:
- 优先使用vo2dto插件。
- 其次,必须在Jujube-Ext插件的配合下使用,此插件带有类复制检测。
- 不允许非上述场景下使用,容易造成潜在问题。
性能报告:
- 参考PojosBenchmark的测试结果:BeanCopier的性能接近原始get set操作,getBeanCopierFromCache的性能是其1/4
- IntelliJ Profiler对于PojosTests#mappingRecordPrimitiveToWrap_multiple()方法的测试结果
- getBeanCopierFromCache()方法占用了94%,其中字符串拼接占用了35%,ConcurrentHashMap#computeIfAbsent()占用了65%
- BeanCopier的性能是没有问题,主要耗时在getBeanCopierFromCache()方法
- Since:
- 2021/09/01
- Author:
- John Li
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic class字段对应类(key-value: sourceFieldName-destFieldName)static final record -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate static final ConcurrentMap<Pojos.QuadKey, BeanCopier> Bean复制机缓存private static final BeanCopierFactoryBean复制工厂 -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionstatic void复制static void复制一个对象的值到另一个对象static BeanCopiergetBeanCopierFromCache(Object sourceObj, Class<?> destClass, Pojos.FieldMapping fieldMapping, boolean cover) 获得bean复制者getFieldNameList(Object sourceObj) 获得字段名称集合private static BeanCopiergetRealBeanCopier(Object sourceObj, Class<?> destClass, boolean cover, Pojos.FieldMapping fieldMapping) 获取真正bean复印机private static TreeSet<?> static <T> T把原始对象映射为对应类型的Pojostatic <T> Tmapping(Object sourceObj, Class<T> destClass, Pojos.FieldMapping fieldMapping) 把原始对象映射为对应类型的Pojostatic <T> List<T> mappingArray(List<?> source, Class<T> class1) 把原始对象集合映射为对应类型的Pojo集合static <T> List<T> mappingArray(List<?> source, Class<T> destClass, Pojos.FieldMapping fieldMapping) 把原始对象集合映射为对应类型的Pojo集合
-
Field Details
-
BEAN_COPIER_FACTORY
Bean复制工厂 -
BEAN_COPIER_CACHE
Bean复制机缓存
-
-
Constructor Details
-
Pojos
public Pojos()
-
-
Method Details
-
mapping
把原始对象映射为对应类型的Pojo- Type Parameters:
T- 泛型- Parameters:
sourceObj- 源objdestClass- 目标类- Returns:
Pojos
-
mapping
把原始对象映射为对应类型的Pojo- Type Parameters:
T- 泛型- Parameters:
sourceObj- 源objdestClass- 目标类fieldMapping- 字段映射- Returns:
Pojos
-
getBeanCopierFromCache
public static BeanCopier getBeanCopierFromCache(Object sourceObj, Class<?> destClass, Pojos.FieldMapping fieldMapping, boolean cover) 获得bean复制者- Parameters:
sourceObj- 源objdestClass- 桌子类fieldMapping- 字段映射cover- 封面- Returns:
BeanCopier
-
getRowKey
-
getRealBeanCopier
private static BeanCopier getRealBeanCopier(Object sourceObj, Class<?> destClass, boolean cover, Pojos.FieldMapping fieldMapping) 获取真正bean复印机- Parameters:
sourceObj- 来源objdestClass- dest类cover- 覆盖fieldMapping- 字段映射- Returns:
BeanCopier
-
getFieldNameList
获得字段名称集合 -
copy
复制一个对象的值到另一个对象- Parameters:
sourceObj- 源objdestObj- obj不在座位上cover- 是否覆盖destObj字段的值。
如果为true,则sourceObj对应字段值会覆盖destObj中对应字段值(不论sourceObj值为空或不为空)
如果为false,则destObj值不为空则不覆盖,为空则覆盖
-
copy
复制- Parameters:
sourceObj- 源objdestObj- obj不在座位上- See Also:
-
mappingArray
把原始对象集合映射为对应类型的Pojo集合 -
mappingArray
public static <T> List<T> mappingArray(List<?> source, Class<T> destClass, Pojos.FieldMapping fieldMapping) 把原始对象集合映射为对应类型的Pojo集合
-