因為公司資料庫分為離線庫和線上庫兩個庫,是以對應的javaBean也被分為了兩個,但是他們之間除了名稱以外,裡面的屬性值都是相同的。百度的時候查到了一個方法,beanutils.copyproperties 這個說可以将一個實體類複制到另一個中,但是當我下載下傳了jar包(jar包下載下傳位址)嘗試了以後,卻在純java項目中報錯了,于是直接手動用反射寫了個類似的方法,感覺其實内部實作原理應該都差不多。
在複制的時候,因為使用了雙層For循環,效率應該有點差,但是保證了防止那種兩個實體類之間略有不同的缺憾。
package com.ljy.util;
import java.lang.reflect.Field;
public class BeanUtils {
/**
* 将一個實體類複制到另一個實體類中
* @param fromBean
* @param ToBean
* @throws IllegalAccessException
* @throws IllegalArgumentException
* @throws Exception
*/
public static void CopySameBean(Object fromBean, Object toBean) throws NullPointerException, IllegalArgumentException, IllegalAccessException {
if(fromBean == toBean) {
return;
}
if(fromBean != null) {
// 得到類對象
Class fromBeanClass = (Class) fromBean.getClass();
Class toBeanClass = (Class) toBean.getClass();
/**
* 得到類中的所有屬性集合
*/
Field[] fbc = fromBeanClass.getDeclaredFields();
Field[] tbc = toBeanClass.getDeclaredFields();
for(int i = 0;i < fbc.length;i++) {
Field f = fbc[i];
f.setAccessible(true); // 設定些屬性是可以通路的
Object fVal = f.get(fromBean);// 得到此屬性的值
System.out.println("name:" + f.getName() + "\t value = " + fVal);
for(int j = 0;j < tbc.length;j++) {
Field t = tbc[i];
t.setAccessible(true); // 設定些屬性是可以通路的
// 屬性名稱和屬性類型必須全部相同,才能指派
if(f.getName().equals(t.getName()) && f.getType().toString().equals(t.getType().toString())){
t.set(toBean, fVal);
}
}
}
} else {
throw new NullPointerException("FromBean is null");
}
}
}