公司的项目是用webservice来进行先后台对接,启动后台后须要刷服务才能在前台生成对应的代码,可是有一个很恶心的地方,它给每一个service都生成了一个model,因而出现后台只有一个javabean,前台生成的代码却有好几个,十几个相同的javabean,惟一的不一样是包名的不一样.java
因而就有了一种需求,将一个javabean转化为另外一个javabean,明明两个类如出一辙,可是由于参数问题,却不得不转,好比工做流那块,就出现了相似这样的代码:web
写了这么长的代码其实啥也没干,就将两个javabean赋值了一下,这样的代码原本就够恶心的了,更恶心的是项目中全部用到工做流的前台窗体中都出现了相似这样的一段代码,spring
惟一不一样就是不一样的窗体中对应的包名有区别而已.有强迫症的我终于受不了了,今天有时间用反射写了一段代码,将一个javabean转化成两个javabean,之后只要直接调用就好了优化
代码以下:spa
/** * 将一个对象转换为另外一个对象 * @param <T1> 要转换的对象 * @param <T2> 转换后的类 * @param orimodel 要转换的对象 * @param castClass 转换后的类 * @return 转换后的对象 */ public static <T1,T2> T2 convertBean(T1 orimodel, Class<T2> castClass) { T2 returnModel = null; try { returnModel = castClass.newInstance(); } catch (Exception e) { throw new RuntimeException("建立"+castClass.getName()+"对象失败"); } List<Field> fieldlist = new ArrayList<Field>(); //要转换的字段集合 while (castClass != null && //循环获取要转换的字段,包括父类的字段 !castClass.getName().toLowerCase().equals("java.lang.object")) { fieldlist.addAll(Arrays.asList(castClass.getDeclaredFields())); castClass = (Class<T2>) castClass.getSuperclass(); //获得父类,而后赋给本身 } for (Field field : fieldlist) { PropertyDescriptor getpd = null; PropertyDescriptor setpd = null; try { getpd= new PropertyDescriptor(field.getName(), orimodel.getClass()); setpd=new PropertyDescriptor(field.getName(), returnModel.getClass()); } catch (Exception e) { continue; } try { Method getMethod = getpd.getReadMethod(); Object transValue = getMethod.invoke(orimodel); Method setMethod = setpd.getWriteMethod(); setMethod.invoke(returnModel, transValue); } catch (Exception e) { throw new RuntimeException("cast "+orimodel.getClass().getName()+"to " +castClass.getName()+" failed"); } } return returnModel; }
刚开始的转化没有包括父类的字段转化,因此在项目中使用报了错,转化后的对象没有父类的字段值,后来优化成了将全部父类的字段一块儿转化了.code
刚开始也只针对工做流进行了转化,后来又优化了一下,使用了泛型,也使得适用性更广,如今支持两个任意的javabean相互转换,将两个javabean中的相同字段相互赋值,不一样字段就直接跳过.对象
不知道方法还有没有啥问题哈,我只进行了简单的自测.应该没啥大问题blog
好吧,其实spring自带的BeanUtils就有这样的功能,引入spring-beans和spring-core以后,就有BeanUtils.copyProperties(a, b);能够实现两个javabean之间的相互拷贝,本身写的就当是研究咯ip