天天看點

通過反射實作将一個實體類複制給另一個實體類

因為公司資料庫分為離線庫和線上庫兩個庫,是以對應的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");
		}
	}
}
           

繼續閱讀