对象拷贝类PropertyUtilsBeanUtilsBeanCopier

上传人:lis****210 文档编号:160931106 上传时间:2022-10-12 格式:DOCX 页数:7 大小:16.29KB
返回 下载 相关 举报
对象拷贝类PropertyUtilsBeanUtilsBeanCopier_第1页
第1页 / 共7页
对象拷贝类PropertyUtilsBeanUtilsBeanCopier_第2页
第2页 / 共7页
对象拷贝类PropertyUtilsBeanUtilsBeanCopier_第3页
第3页 / 共7页
点击查看更多>>
资源描述
对象拷贝类PropertyUtils, BeanUtils, BeanCopier功能简介业务系统中经常需要两个对象进行属性的拷贝,不能否认逐个的对象拷贝是最快速最安 全的做法,但是当数据对象的属性字段数量超过程序员的容忍的程度,代码因此变得臃 肿不堪,使用一些方便的对象拷贝工具类将是很好的选择。Apache的两个版本:(反射机制)mons.bean uti ls.Proper tyUti ls.copyProper ti es(Objec t des t, Object orig)mons.bean uti ls.Bean Uti ls.copyProper ti es(Objec t des t, Objec t orig)spring版本:(反射机制)org.springframework.beans.Bean Uti ls.copyProper ties(Objec t source, Objec ttarget. Class editable, String ignoreProperties)cglib版本:(使用动态代理,效率高)net .sf.cglib.beans.BeanCopier.copy(Objec t paramObjec tl, Objec t paramObjec t2, Converter paramConverter)都使用静态类调用,最终转化虚拟机中两个单例的工具对象。public BeanUtilsBean()t his (new Conver tUti lsBean(), new Proper tyUti lsBeanO);ConvertUtilsBean可以通过ConvertUtils全局自定义注册。 Conver tUti ls.Regis ter(new Dat eConver t(), Java.uti l.Da te.class);PropertyUtilsBean 的 copyProperties 方法实现了拷贝的算法1、动态 bean: orig instanceof DynaBean: Object value =(DynaBean)orig).get(name);然后把 value 复制到动态 bean 类2、Map 类型:orig instanceof Map: key 值逐个拷贝3、其他普通类:从beaninfo【每一个对象都有一个缓存的bean信息,包含属性 字段等】取出name,然后把sourceClass和targetClass逐个拷贝类型:BeanCopiercopier = BeanCopier.crea te(source.ge tClass(), t arge t.ge tClass(), false); copier.copy(source, t arge t, null);Create对象过程:产生sourceClass TargetClass的拷贝代理类,放入jvm中,所以 创建的代理类的时候比较耗时。最好保证这个对象的单例模式,可以参照最后一部分的 优化方案。创建过程:源代码见jdk:net .sf.cglib.beans.BeanCopier.Genera to r.genera teClass(ClassVisi tor)1、获取 sourceClass 的所有 public get 方法-Proper ty Descrip to r gett ers2、获取 Targe tClass 的所有 public set 方法-Proper ty Descrip to r sett ers3、遍历setters的每一个属性,执行4和54、按 sett ers 的 name 生成 sourceClass 的所有 setter 方法-Proper ty Descrip tor getter【不符合javabean规范的类将会可能出现空指针异常】5、PropertyDescriptor setters-PropertyDescriptor setter6、将setter和getter名字和类型 配对,生成代理类的拷贝方法。Copy属性过程:调用生成的代理类,代理类的代码和手工操作的代码很类似,效率非常缺陷预防陷阱条件ApacheProper tyUti lsApacheBean UtilsSpring-BeanUtilsCglib-BeanCopier是否可以扩展 useConvete 功能NOYesYesYes,但比 较难用(sourceObject ,targetObject) 的顺序逆序逆序OKOK对 sourceObject 特殊属性的限 制:(Date , BigDecimal 等)【见备注1】OKNO,异常 出错OKOK相同属性名,且 类型不匹配时候 的处理【见备注2】异常,拷贝部 分属性,非常 危险OK,并能 进行初级 转换,Long 和 Integer 互转异常,拷贝部分属 性OK,但是该 属性不拷 贝Get和set方法 不匹配的处理【见备注3】OKOKOK创建拷贝 的时候报 错,无法拷 贝任何属 性(当且仅 当 sourceCla ss的get方 法超过set 方法)对 targetObject 特殊属性的限制:(Date, BigDecimal 等) 原因:dateTimeConveter的conveter没有对null值的处理 public class ErrorBeanUtilObject /此处省略 getter, setter 方法 private String name;private java. util.Date date; public class ErrorBeanUtilsTest public static void main(String args) throws Throwable ErrorBeanUtilObject from = new ErrorBeanUtilObject(); ErrorBeanUtilObject to 二 new ErrorBeanUtilObject(); /from.se tDat e(new java. uti l.Da te();from.se tN ame(TTTT); mons.bean uti ls.Bean Uti ls.copyProper ti es( to, from);/如果from.se tDate去掉,此处出现conve ter异常Sys tem.o ut .pri ntl n(ToS tringBuilder.reflec tio nToS tring(from); Sys tem.o ut .pri ntl n(ToS tringBuilder.reflec tio nToS tring( to); 相同属性名,且类型不匹配时候的处理原因:这两个工具类不支持同名异类型的匹配!【包装类Long和原始数据类 型long是可以的】public class TargetClass /此处省略 getter,setter 方法private Long num;private String name;public class TargetClass /此处省略 getter,setter 方法private Long num;private String name;public class ErrorPropertyUtilsTest public static void main(Stringargs) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException SourceClass from = new SourceClassO; from.se tN um(l);from.se tN ame(name);TargetClass to 二 new TargetClass(); mons.bean uti ls.Proper tyUti ls.copyProper ties( to, from); /抛出参数不匹配异常org.springframework.beans.Bean Uti ls.copyProper ti es(fr om, t o);/抛出参数不匹配异常Sys tem.o ut .pri ntl n(ToS tringBuilder.reflec tio nToS tring (from);Sys tem.o ut .pri ntl n(ToS tringBuilder.reflec tio nToS tring (to);Get和set方法不匹配的处理public class ErrorBeanCopierTes t /* 从该用例看出 BeanCopier.create 的 target.class 的每一个 get 方法必须有队形的set方法* param args*/ public static void main(String args) BeanCopier copier = BeanCopier.create(UnSatifisedBeanCopierObject. class, SourceClass. class, false);copier = BeanCopier.create(SourceClass. class, UnSatifisedBeanCopierObject. class,false); /此处抛出异常创建 class UnSatifisedBeanCopierObject private String name;private Long num; public St ring getN ame() return name;public void setName(String name) t his.name = name;public Long getN um() return num;/ public void setNum(Long num) /t his.num = num;/ 优化方案的beanUtils的拷贝属性,注册一些新的类型转换 public class BeanUtilsEx extends BeanUtilspublic static void copyProperties(Object dest, Object orig)tryBean Uti ls.copyProper ti es(des t, orig); catch (IllegalAccessException ex) ex.pri ntSt ackTrace(); catch (InvocationTargetException ex) ex.pri ntSt ackTrace();staticConver tUti ls.regis ter(newDat eConver t(),java. util.Date.class);Conver tUti ls.regis ter(new Dat eConver t(), java.sql.Da te.class); Conver tUti ls.regis ter(newBigDecimalConver t(),BigDecimal.class);将beancopier做成静态类,方便拷贝public class BeanCopierUtils publicstatic Map beanCopierMap = new HashMap();public static void copyProperties(0bject source, Object t arge t)St ring beanKey =genera teKey(source.ge tClass(),t arge t.ge tClassO);BeanCopier copier = null;if (!beanCopierMap.co nt ainsKey(beanKey)copier =BeanCopier.crea te(source.ge tClass(), t arge t.ge tClass(),false);beanCopierMap.p ut( beanKey, copier);else copier = beanCopierMap.get(beanKey);copier.copy(source, t arge t,null);private static String generateKey(Class class1,Classclass2)return class1 .toSt ring() + class2 .toSt ring(); 修复beanCopier对set方法强限制的约束改写net .sf.cglib.beans.BeanCopier.Genera to r.genera teClass(ClassVisi tor) 方法将133行的MethodInfowrite=Reflec tUti ls.ge tMet hodInfo(se tt er.ge tWrit eMe thod(); 预先存一个names2放入/* 109 */* 110 */* 111 */gettersi);Map names2 = new HashMap();for (int i 二 0; i getters.length; +i) names2.p ut(sett ersi.ge tN ame(),/* */调用这行代码前判断查询下,如果没有改writeMethod则忽略掉该字段的操作,这样就可以避免异常的发生。
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 图纸设计 > 毕设全套


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!