- 许多网友都做过BeanCopier,BeanUtils的测试,基本BeanCopier的性能是BeanUtils的10倍以上。,出了反射这一性能差异外,BeanUtils默认是开启Converter功能,允许同名,不同类型的属性进行拷贝,比如Date对象到String属性。
- 有兴趣的同学可以去比较下PropertyUtils,默认不开启Converter功能,发现性能是BeanUtils的2倍多。
初始化例子:BeanCopier copier = BeanCopier.create(Source.class, Target.class, true);
第三个参数useConverter,是否开启Convert,默认BeanCopier只会做同名,同类型属性的copier,否则就会报错。
Converter使用例子代码
- public class BeanCopierTest {
- public static void main(String args[]) {
- System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "/tmp/1");
- BeanCopier copier = BeanCopier.create(Source.class, Target.class, true);
- Source from = new Source();
- from.setValue(1);
- Target to = new Target();
- Converter converter = new BigIntConverter();
- copier.copy(from, to, converter); //使用converter类
- System.out.println(to.getValue());
- }
- }
- class BigIntConverter implements net.sf.cglib.core.Converter {
- @Override
- public Object convert(Object value, Class target, Object context) {
- System.out.println(value.getClass() + " " + value); // from类中的value对象
- System.out.println(target); // to类中的定义的参数对象
- System.out.println(context.getClass() + " " + context); // String对象,具体的方法名
- if (target.isAssignableFrom(BigInteger.class)) {
- return new BigInteger(value.toString());
- } else {
- return value;
- }
- }
- }
- ----
- 反编译后看的代码:
- public class Target$$BeanCopierByCGLIB$$e1c34377 extends BeanCopier
- {
- public void copy(Object obj, Object obj1, Converter converter)
- {
- Target target = (Target)obj1;
- Source source = (Source)obj;
- // 注意是直接调用,没有通过reflect
- target.setValue((BigInteger)converter.convert(new Integer(source.getValue()), CGLIB$load_class$java$2Emath$2EBigInteger, "setValue"));
- }
- }
使用注意
- 避免每次进行BeanCopier.create创建对象,一般建议是通过static BeanCopier copier = BeanCopier.create()
- 合理使用converter。
- 应用场景:两个对象之间同名同属性的数据拷贝, 不能单独针对其中的几个属性单独拷贝
copy.copy(n, his, null);