欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-15 09:47:53
...

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