天天看点

常见Bean映射工具分析评测及Orika介绍

Bean映射工具选择

      工作中,我们经常需要将对象转换成不同的形式以适应不同的api,或者在不同业务层中传输对象而不同分层的对象存在不同的格式,因此我们需要编写映射代码将对象中的属性值从一种类型转换成另一种类型。

     进行这种转换除了手动编写大量的

get/set

代码,还可以使用一些方便的类库,常用的有apache的

BeanUtils

,spring的

BeanUtils

,cglib的

BeanCopier

BeanUtils

      apache的

BeanUtils

和spring的

BeanUtils

中拷贝方法的原理都是先用jdk中

java.beans.Introspector

类的

getBeanInfo()

方法获取对象的属性信息及属性get/set方法,接着使用反射(

Method

invoke(Object obj, Object... args)

)方法进行赋值。apache支持名称相同但类型不同的属性的转换,spring支持忽略某些属性不进行映射,他们都设置了缓存保存已解析过的

BeanInfo

信息。

BeanCopier

     cglib的

BeanCopier

采用了不同的方法:它不是利用反射对属性进行赋值,而是直接使用ASM的

MethodVisitor

直接编写各属性的

get/set

方法(具体过程可见

BeanCopier

类的

generateClass(ClassVisitor v)

方法)生成class文件,然后进行执行。由于是直接生成字节码执行,所以

BeanCopier

的性能较采用反射的

BeanUtils

有较大提高,这一点可在后面的测试中看出。

Dozer

     使用以上类库虽然可以不用手动编写

get/set

方法,但是他们都不能对不同名称的对象属性进行映射。在定制化的属性映射方面做得比较好的有Dozer,Dozer支持简单属性映射、复杂类型映射、双向映射、隐式映射以及递归映射。可使用xml或者注解进行映射的配置,支持自动类型转换,使用方便。但Dozer底层是使用reflect包下

Field

类的

set(Object obj, Object value)

方法进行属性赋值,执行速度上不是那么理想。

Orika

      那么有没有特性丰富,速度又快的Bean映射工具呢,这就是下面要介绍的Orika,Orika是近期在github活跃的项目,底层采用了javassist类库生成Bean映射的字节码,之后直接加载执行生成的字节码文件,因此在速度上比使用反射进行赋值会快很多,下面详细介绍Orika的使用方法。

    关于Javassist是一个开源的分析、编辑和创建Java字节码的类库。是由东京工业大学的数学和计算机科学系的 Shigeru Chiba (千叶 滋)所创建的。它已加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作为JBoss实现动态"AOP"框架。

    关于java字节码的处理,有很多工具,如bcel,asm。不过这些都需要直接跟虚拟机指令打交道。如果你不想了解虚拟机指令,可以采用javassist。javassist是jboss的一个子项目,其主要的优点,在于简单,而且快速。直接使用java编码的形式,而不需要了解虚拟机指令,就能动态改变类的结构,或者动态生成类。

具体请看:

     https://blog.csdn.net/qq_36204764/article/details/104615386