1. 实体(3个 模拟多层父级)支持多层父级和List,map的copy值(如若不能复制或有问题,请评论留言!十分感谢!)
public class StudentDemo extends StudentF {
private Integer stuId;
private String stuName;
private String stuPrice;
private boolean flg;
private List<String> listString;
private HashMap<String, StuType> mapType;
public HashMap<String, StuType> getMapType() {
return mapType;
}
public void setMapType(HashMap<String, StuType> mapType) {
this.mapType = mapType;
}
public List<String> getListString() {
return listString;
}
public void setListString(List<String> listString) {
this.listString = listString;
}
public boolean isFlg() {
return flg;
}
public void setFlg(boolean flg) {
this.flg = flg;
}
public StudentDemo(HashMap<String, StuType> mapType, List<StuType> listType, List<String> listString, Integer stuId, String stuName, String stuPrice, String stuSex, Integer stuAge, String stuNum, String stuTel, boolean isFlg) {
this.stuId = stuId;
this.stuName = stuName;
this.stuPrice = stuPrice;
super.setStudentSex(stuSex);
super.setStudentAge(stuAge);
super.setStuNum(stuNum);
super.setTel(stuTel);
this.flg = isFlg;
this.listString = listString;
super.setListType(listType);
this.mapType = mapType;
}
public StudentDemo(){}
@Override
public String toString() {
return "StudentDemo{" +
"stuId=" + stuId +
", stuName='" + stuName + '\'' +
", stuPrice='" + stuPrice + '\'' +
", stuSex='" + super.getStudentSex() + '\'' +
", stuAge='" + super.getStudentAge() + '\'' +
", stuNum='" + super.getStuNum() + '\'' +
", stuTel='" + super.getTel() + '\'' +
", flg='" + flg + '\'' +
", listString='" + listString + '\'' +
", listType='" + super.getListType() + '\'' +
", mapType='" + mapType + '\'' +
'}';
}
public Integer getStuId() {
return stuId;
}
public void setStuId(Integer stuId) {
this.stuId = stuId;
}
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
public String getStuPrice() {
return stuPrice;
}
public void setStuPrice(String stuPrice) {
this.stuPrice = stuPrice;
}
}
public class StudentF extends StudentX {
private String studentSex;
private Integer studentAge;
private List<StuType> listType;
public List<StuType> getListType() {
return listType;
}
public void setListType(List<StuType> listType) {
this.listType = listType;
}
public String getStudentSex() {
return studentSex;
}
public void setStudentSex(String studentSex) {
this.studentSex = studentSex;
}
public Integer getStudentAge() {
return studentAge;
}
public void setStudentAge(Integer studentAge) {
this.studentAge = studentAge;
}
}
public class StudentX {
private String stuNum;
private String Tel;
public String getStuNum() {
return stuNum;
}
public void setStuNum(String stuNum) {
this.stuNum = stuNum;
}
public String getTel() {
return Tel;
}
public void setTel(String tel) {
Tel = tel;
}
}
2. 工具类
package com.books.utils;
import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* 复制一个实体对象
* 修改新对象时不影响源对象的值
* @param <T> 项目中任意类型
*/
public class CopyObjectEntity<T> {
/**
* 复制实体方法
* @param orderEntity 源对象
* @param newEntity 新对象
* @return 新对象
*/
public T newPojo(Object orderEntity, Object newEntity){
// 新对象
T newPojo = null;
try {
// 源对象
T orderPojo = (T)orderEntity;
newPojo = (T)newEntity;
// 获取所有方法,包括父类
Method[] orderObject = orderPojo.getClass().getMethods();
// 遍历所有方法
for(int a = 0; a < orderObject.length; a ++){
// 得到每一个方法名称
String name = orderObject[a].getName();
// 判断获取需要的(普通的字段都是get/set),这里获取get方法因为get到值才能赋值
if(!name.equals("setClass") && !name.equals("class") && !name.equals("getClass") && name.startsWith("get")){
// 获取方法
Method method = orderPojo.getClass().getMethod(name, new Class[] {});
// 执行方法
Object value = method.invoke(orderPojo, new Object[] {});
// 拼接set方法
String aa = orderObject[a].getName().substring(3);
String bb = aa.substring(0, 1).toUpperCase();
String setter = bb + aa.substring(1);
// 创建描述器
PropertyDescriptor pd = new PropertyDescriptor(setter, newPojo.getClass());
//为上面声明的字段设置set方法(又称内省)
Method setMethod = pd.getWriteMethod();
// 执行set
setMethod.invoke(newPojo, value);
}
// 判断是boolean的字段get时为is
if(!name.equals("setClass") && !name.equals("class") && !name.equals("getClass") && name.startsWith("is")){
Method method = orderPojo.getClass().getMethod(name, new Class[] {});
Object value = method.invoke(orderPojo, new Object[] {});
String aa = orderObject[a].getName().substring(2);
String bb = aa.substring(0, 1).toUpperCase();
String setter = bb + aa.substring(1);
PropertyDescriptor pd = new PropertyDescriptor(setter, newPojo.getClass());
//为上面声明的字段设置set方法(又称内省)
Method setMethod = pd.getWriteMethod();
// 执行set
setMethod.invoke(newPojo, value);
}
}
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (IntrospectionException e) {
e.printStackTrace();
}catch (Exception e) {
e.printStackTrace();
}
return newPojo;
}
}
3. 测试
public void test7(){
List<String> ls = new ArrayList<>();
ls.add("aa");
ls.add("bb");
ls.add("cc");
List<StuType> listType = new ArrayList<>();
listType.add(new StuType(1, "类型1"));
listType.add(new StuType(2, "类型2"));
HashMap<String, StuType> mapType = new HashMap<>();
mapType.put("11", new StuType(11, "map1"));
mapType.put("22", new StuType(22, "map2"));
StudentDemo studentDemo = new StudentDemo(mapType, listType, ls,1, "aa" ,null, "男", 23, "010010", "15244669988", true);
StudentDemo studentDemo1 = new StudentDemo();
new CopyObjectEntity<StudentDemo>().newPojo(studentDemo, studentDemo1);
System.out.println("复制完的新对象"+studentDemo1);
studentDemo1.setStuId(22);
studentDemo1.setStuName("你好啊");
studentDemo1.setStuPrice("啦啦啦");
studentDemo1.setStudentSex("女");
studentDemo1.setStudentAge(20);
studentDemo1.setStuNum("没有学号");
studentDemo1.setTel("没有电话");
studentDemo1.setFlg(false);
List<String> ls1 = new ArrayList<>();
ls1.add("33");
ls1.add("44");
ls1.add("55");
List<StuType> listType1 = new ArrayList<>();
listType1.add(new StuType(-1, "类型-1"));
listType1.add(new StuType(-2, "类型-2"));
HashMap<String, StuType> mapType1 = new HashMap<>();
mapType1.put("11", new StuType(-11, "map-1"));
mapType1.put("22", new StuType(-22, "map-2"));
studentDemo1.setListType(listType1);
studentDemo1.setMapType(mapType1);
studentDemo1.setListString(ls1);
System.out.println("源对象"+studentDemo);
System.out.println("修改复制后对象"+studentDemo1);
System.out.println("再次查看源对象"+studentDemo);
}
4. 结果