通过反射实现将一个实体类复制给另一个实体类

因为公司数据库分为离线库和在线库两个库,所以对应的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");
		}
	}
}

猜你喜欢

转载自blog.csdn.net/ljy950914/article/details/82998365