通过反射实现将一个实体类复制给另一个实体类
程序员文章站
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");
}
}
}