您的位置:首页 > 运维架构

BeanCopier 实现 值传递

2016-04-14 20:47 253 查看
不同类型的对象赋值(省去一个个set,get的麻烦,优化代码),通过反射来实现 ,倘若对象里面包含对象,此方法也能赋值的,Contract 包含attachments(一个对象)

public static Contract convertContractDtoFromKAD(com.dianping.contract.dto.Contract contract) {

if (contract == null) {

return null;

}

Contract contractTmp = new Contract();

BeanCopier.create(contract.getClass(), contractTmp.getClass(), false).copy(contract, contractTmp, null); // 不同类型的对象赋值(省去一个个set的麻烦,优化代码)

return contractTmp;

}

倘若有的变量没有,单独再set 。

public static Contract convertContractDtoFromDPT(com.dianping.contractinfo.dto.Contract contract) {

if (contract == null) {

return null;

}

Contract contractTmp = new Contract();

BeanCopier.create(contract.getClass(), contractTmp.getClass(), false).copy(contract, contractTmp, null);

contractTmp.setTuan2Tui(false);

contractTmp.setExternalID(0);

return contractTmp;

}

copier = BeanCopier.create(source.getClass(), target.getClass(), false);

copier.copy(source, target, null);

Create对象过程:产生sourceClass-》TargetClass的拷贝代理类,放入jvm中,所以创建的代理类的时候比较耗时。最好保证这个对象的单例模式,可以参照最后一部分的优化方案。

创建过程:源代码见jdk:net.sf.cglib.beans.BeanCopier.Generator.generateClass(ClassVisitor)

1、 获取sourceClass的所有public get 方法-》PropertyDescriptor[] getters

2、 获取TargetClass 的所有 public set 方法-》PropertyDescriptor[] setters

3、 遍历setters的每一个属性,执行4和5

4、 按setters的name生成sourceClass的所有setter方法-》PropertyDescriptor getter【不符合javabean规范的类将会可能出现空指针异常】

5、 PropertyDescriptor[] setters-》PropertyDescriptor setter

6、 将setter和getter名字和类型 配对,生成代理类的拷贝方法。

Copy属性过程:调用生成的代理类,代理类的代码和手工操作的代码很类似,效率非常高。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: