公司的項目是用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