流程:先创建目标对象的实例,然后根据字段名称和类型匹配目标对象和被复制对象相同的字段,再用setAccessible()获取访问private类型字段的权限,最后赋值给目标对象的实例。
方法:
public static <T1, T2> T2 copyBean2Bean(T1 obj, Class toClass) {
Class fromClass = obj.getClass();//源数据类
T2 toObj = null;
try {
toObj = toClass.newInstance();/*获取实例*/
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
/*
*getDeclaredFields()获得某个类的所有声明的字段,包括public、private和proteced,不包括父类的声明字段。
* getFields()获得某个类的所有的public的字段,包括父类中的字段。
* */
Field[] fromClassFields = fromClass.getDeclaredFields();
Field toClassFiled = null;
for (Field filed : fromClassFields) {
try {
toClassFiled = toClass.getDeclaredField(filed.getName());//toClass中名称是filed.getName()Filed
} catch (NoSuchFieldException e) {
System.out.println("toClassFiled没有跟filed名称匹配的字段");
continue;
}
if (filed.getName().equals(toClassFiled.getName())
&& filed.getType().getName().equals(toClassFiled.getType().getName())) {/*名称和类型都一样*/
filed.setAccessible(true);/*获取private字段的访问权限*/
toClassFiled.setAccessible(true);
try {
toClassFiled.set(toObj, filed.get(obj));/*赋值*/
} catch (IllegalAccessException e) {
e.printStackTrace();
}
filed.setAccessible(false);/*取消权限*/
toClassFiled.setAccessible(false);
}
}
return toObj;
}
例子:
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class People {
private String name;
public int age;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Person {
private String name;
private int age;
}
运行代码:
public class Test {
public static void main(String [] args){
Person person=new Person(“AAA”,18);
People people= EntityUtils.copyObject(person,People.class);
System.out.println(person);
System.out.println(people);
}
}
结果: