工作中经常遇到对象的拷贝问题,但是对象的深拷贝大部分工具类是不支持的,这里
开发过程中遇到过对同一个对象进行拷贝的情况这里使用反射解决
@Data
public class CaptureStatisticsCompany implements Serializable {
private static final long serialVersionUID = 1L;
private Long ID;
private String deptCode;
private Date calculationDate;
private Integer deleteFlag;
private String REMARK;
private Long entInfoCount;
private Long perCertOtherCount;
private Long raPlStatCount;
private Long raBtStatCount;
private Long gcResPlCount;
private Long gcResBtCount;
private Long gcComCount;
private Long plBaseCount;
private Long plSectionCount;
private Long plNodeCount;
private Long plUrbanStatCount;
private Long plRuralStatCount;
private Long stationCount;
private Long plDeviceCount;
private Long emgPlanECount;
private Long emgPlanGCount;
private Long emgTeamCount;
private Long emgVehicleCount;
private Long emgDepotCount;
private Long emgMaterialCount;
private Long apmEntInfoCount;
private Long apmPerCertOtherCount;
private Long apmRaPlStatCount;
private Long apmRaBtStatCount;
private Long apmGcResPlCount;
private Long apmGcResBtCount;
private Long apmGcComCount;
private Long apmPlBaseCount;
private Long apmPlSectionCount;
private Long apmPlNodeCount;
private Long apmPlUrbanStatCount;
private Long apmPlRuralStatCount;
private Long apmStationCount;
private Long apmPlDeviceCount;
private Long apmEmgPlanECount;
private Long apmEmgPlanGCount;
private Long apmEmgTeamCount;
private Long apmEmgVehicleCount;
private Long apmEmgDepotCount;
private Long apmEmgMaterialCount;
private Long aprEntInfoCount;
private Long aprPerCertOtherCount;
private Long aprRaPlStatCount;
private Long aprRaBtStatCount;
private Long aprGcResPlCount;
private Long aprGcResBtCount;
private Long aprGcComCount;
private Long aprPlBaseCount;
private Long aprPlSectionCount;
private Long aprPlNodeCount;
private Long aprPlUrbanStatCount;
private Long aprPlRuralStatCount;
private Long aprStationCount;
private Long aprPlDeviceCount;
private Long aprEmgPlanECount;
private Long aprEmgPlanGCount;
private Long aprEmgTeamCount;
private Long aprEmgVehicleCount;
private Long aprEmgDepotCount;
private Long aprEmgMaterialCount;
private String entName;
private String entUuid;
}
浅拷贝失效
public class testClone {
public static void main(String[] args) throws Exception {
CaptureStatisticsCompany a = new CaptureStatisticsCompany();
a.setEntInfoCount(1L);
a.setEntUuid("test01");
List<CaptureStatisticsCompany> list1 = Arrays.asList(a);
System.out.println("a:"+a);
CaptureStatisticsCompany b = new CaptureStatisticsCompany();
b.setEntUuid("test01");
b.setApmEntInfoCount(2L);
System.out.println("b:"+b);
List<CaptureStatisticsCompany> list2 = Arrays.asList(b);
System.out.println("list2:"+list2);
List<CaptureStatisticsCompany> BeanUtilsResult = new ArrayList<>();
List<CaptureStatisticsCompany> result = new ArrayList<>();
for (CaptureStatisticsCompany company : list1) {
for (CaptureStatisticsCompany s : list2) {
if (company.getEntUuid().equals(s.getEntUuid())) {
try {
BeanUtils.copyProperties(company,s);
} catch (Exception e) {
e.printStackTrace();
}
}
}
BeanUtilsResult.add(company);
}
System.err.println(" BeanUtils.copyProperties:"+BeanUtilsResult);
}
运行结果
a:CaptureStatisticsCompany(ID=null, deptCode=null, calculationDate=null, deleteFlag=null, REMARK=null, entInfoCount=1, perCertOtherCount=null, raPlStatCount=null, raBtStatCount=null, gcResPlCount=null, gcResBtCount=null, gcComCount=null, plBaseCount=null, plSectionCount=null, plNodeCount=null, plUrbanStatCount=null, plRuralStatCount=null, stationCount=null, plDeviceCount=null, emgPlanECount=null, emgPlanGCount=null, emgTeamCount=null, emgVehicleCount=null, emgDepotCount=null, emgMaterialCount=null, apmEntInfoCount=null, apmPerCertOtherCount=null, apmRaPlStatCount=null, apmRaBtStatCount=null, apmGcResPlCount=null, apmGcResBtCount=null, apmGcComCount=null, apmPlBaseCount=null, apmPlSectionCount=null, apmPlNodeCount=null, apmPlUrbanStatCount=null, apmPlRuralStatCount=null, apmStationCount=null, apmPlDeviceCount=null, apmEmgPlanECount=null, apmEmgPlanGCount=null, apmEmgTeamCount=null, apmEmgVehicleCount=null, apmEmgDepotCount=null, apmEmgMaterialCount=null, aprEntInfoCount=null, aprPerCertOtherCount=null, aprRaPlStatCount=null, aprRaBtStatCount=null, aprGcResPlCount=null, aprGcResBtCount=null, aprGcComCount=null, aprPlBaseCount=null, aprPlSectionCount=null, aprPlNodeCount=null, aprPlUrbanStatCount=null, aprPlRuralStatCount=null, aprStationCount=null, aprPlDeviceCount=null, aprEmgPlanECount=null, aprEmgPlanGCount=null, aprEmgTeamCount=null, aprEmgVehicleCount=null, aprEmgDepotCount=null, aprEmgMaterialCount=null, entName=null, entUuid=test01)
b:CaptureStatisticsCompany(ID=null, deptCode=null, calculationDate=null, deleteFlag=null, REMARK=null, entInfoCount=null, perCertOtherCount=null, raPlStatCount=null, raBtStatCount=null, gcResPlCount=null, gcResBtCount=null, gcComCount=null, plBaseCount=null, plSectionCount=null, plNodeCount=null, plUrbanStatCount=null, plRuralStatCount=null, stationCount=null, plDeviceCount=null, emgPlanECount=null, emgPlanGCount=null, emgTeamCount=null, emgVehicleCount=null, emgDepotCount=null, emgMaterialCount=null, apmEntInfoCount=2, apmPerCertOtherCount=null, apmRaPlStatCount=null, apmRaBtStatCount=null, apmGcResPlCount=null, apmGcResBtCount=null, apmGcComCount=null, apmPlBaseCount=null, apmPlSectionCount=null, apmPlNodeCount=null, apmPlUrbanStatCount=null, apmPlRuralStatCount=null, apmStationCount=null, apmPlDeviceCount=null, apmEmgPlanECount=null, apmEmgPlanGCount=null, apmEmgTeamCount=null, apmEmgVehicleCount=null, apmEmgDepotCount=null, apmEmgMaterialCount=null, aprEntInfoCount=null, aprPerCertOtherCount=null, aprRaPlStatCount=null, aprRaBtStatCount=null, aprGcResPlCount=null, aprGcResBtCount=null, aprGcComCount=null, aprPlBaseCount=null, aprPlSectionCount=null, aprPlNodeCount=null, aprPlUrbanStatCount=null, aprPlRuralStatCount=null, aprStationCount=null, aprPlDeviceCount=null, aprEmgPlanECount=null, aprEmgPlanGCount=null, aprEmgTeamCount=null, aprEmgVehicleCount=null, aprEmgDepotCount=null, aprEmgMaterialCount=null, entName=null, entUuid=test01)
list2:[CaptureStatisticsCompany(ID=null, deptCode=null, calculationDate=null, deleteFlag=null, REMARK=null, entInfoCount=null, perCertOtherCount=null, raPlStatCount=null, raBtStatCount=null, gcResPlCount=null, gcResBtCount=null, gcComCount=null, plBaseCount=null, plSectionCount=null, plNodeCount=null, plUrbanStatCount=null, plRuralStatCount=null, stationCount=null, plDeviceCount=null, emgPlanECount=null, emgPlanGCount=null, emgTeamCount=null, emgVehicleCount=null, emgDepotCount=null, emgMaterialCount=null, apmEntInfoCount=2, apmPerCertOtherCount=null, apmRaPlStatCount=null, apmRaBtStatCount=null, apmGcResPlCount=null, apmGcResBtCount=null, apmGcComCount=null, apmPlBaseCount=null, apmPlSectionCount=null, apmPlNodeCount=null, apmPlUrbanStatCount=null, apmPlRuralStatCount=null, apmStationCount=null, apmPlDeviceCount=null, apmEmgPlanECount=null, apmEmgPlanGCount=null, apmEmgTeamCount=null, apmEmgVehicleCount=null, apmEmgDepotCount=null, apmEmgMaterialCount=null, aprEntInfoCount=null, aprPerCertOtherCount=null, aprRaPlStatCount=null, aprRaBtStatCount=null, aprGcResPlCount=null, aprGcResBtCount=null, aprGcComCount=null, aprPlBaseCount=null, aprPlSectionCount=null, aprPlNodeCount=null, aprPlUrbanStatCount=null, aprPlRuralStatCount=null, aprStationCount=null, aprPlDeviceCount=null, aprEmgPlanECount=null, aprEmgPlanGCount=null, aprEmgTeamCount=null, aprEmgVehicleCount=null, aprEmgDepotCount=null, aprEmgMaterialCount=null, entName=null, entUuid=test01)]
BeanUtils.copyProperties:[CaptureStatisticsCompany(ID=null, deptCode=null, calculationDate=null, deleteFlag=null, REMARK=null, entInfoCount=1, perCertOtherCount=null, raPlStatCount=null, raBtStatCount=null, gcResPlCount=null, gcResBtCount=null, gcComCount=null, plBaseCount=null, plSectionCount=null, plNodeCount=null, plUrbanStatCount=null, plRuralStatCount=null, stationCount=null, plDeviceCount=null, emgPlanECount=null, emgPlanGCount=null, emgTeamCount=null, emgVehicleCount=null, emgDepotCount=null, emgMaterialCount=null, apmEntInfoCount=null, apmPerCertOtherCount=null, apmRaPlStatCount=null, apmRaBtStatCount=null, apmGcResPlCount=null, apmGcResBtCount=null, apmGcComCount=null, apmPlBaseCount=null, apmPlSectionCount=null, apmPlNodeCount=null, apmPlUrbanStatCount=null, apmPlRuralStatCount=null, apmStationCount=null, apmPlDeviceCount=null, apmEmgPlanECount=null, apmEmgPlanGCount=null, apmEmgTeamCount=null, apmEmgVehicleCount=null, apmEmgDepotCount=null, apmEmgMaterialCount=null, aprEntInfoCount=null, aprPerCertOtherCount=null, aprRaPlStatCount=null, aprRaBtStatCount=null, aprGcResPlCount=null, aprGcResBtCount=null, aprGcComCount=null, aprPlBaseCount=null, aprPlSectionCount=null, aprPlNodeCount=null, aprPlUrbanStatCount=null, aprPlRuralStatCount=null, aprStationCount=null, aprPlDeviceCount=null, aprEmgPlanECount=null, aprEmgPlanGCount=null, aprEmgTeamCount=null, aprEmgVehicleCount=null, aprEmgDepotCount=null, aprEmgMaterialCount=null, entName=null, entUuid=test01)]
Process finished with exit code 0
![在这里插入图片描述](https://img-blog.csdnimg.cn/b4891527bfef4bbe8146eb5038c0db3a.png)
反射的方法进行深拷贝,同时可以自定义获取不为null的值等操作
public class testClone {
public static void main(String[] args) throws Exception {
CaptureStatisticsCompany a = new CaptureStatisticsCompany();
a.setEntInfoCount(1L);
a.setEntUuid("test01");
List<CaptureStatisticsCompany> list1 = Arrays.asList(a);
System.out.println("a:"+a);
CaptureStatisticsCompany b = new CaptureStatisticsCompany();
b.setEntUuid("test01");
b.setApmEntInfoCount(2L);
System.out.println("b:"+b);
List<CaptureStatisticsCompany> list2 = Arrays.asList(b);
System.out.println("list2:"+list2);
List<CaptureStatisticsCompany> BeanUtilsResult = new ArrayList<>();
List<CaptureStatisticsCompany> result = new ArrayList<>();
for (CaptureStatisticsCompany company : list1) {
CaptureStatisticsCompany captureStatisticsCompany = BeanUtil.copyProperties(company, CaptureStatisticsCompany.class);
for (CaptureStatisticsCompany s : list2) {
if (company.getEntUuid().equals(s.getEntUuid())) {
try {
captureStatisticsCompany = (CaptureStatisticsCompany) setValues(objectToMap(s), company);
} catch (Exception e) {
e.printStackTrace();
}
}
}
result.add(captureStatisticsCompany);
}
System.out.println();
System.err.println("result:" + result);
}
public static HashMap<String, Object> objectToMap(Object obj) {
HashMap<String, Object> map = new HashMap<>();
Field[] fields = obj.getClass().getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
String fieldName = field.getName();
try {
Object fieldValue = field.get(obj);
if (null != fieldValue) {
map.put(fieldName, fieldValue);
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
return map;
}
public static Object setValues(HashMap<String, Object> map, Object company) throws Exception {
System.out.println("map"+map);
Field[] fields = CaptureStatisticsCompany.class.getDeclaredFields();
for (Field field : fields) {
String fieldName = field.getName();
if (map.containsKey(fieldName) && !"serialVersionUID".equals(fieldName)) {
field.setAccessible(true);
Object value = map.get(fieldName);
field.set(company, value);
}
}
System.out.println("company"+company);
return company;
}
}
输出结果
result:[CaptureStatisticsCompany(ID=null, deptCode=null, calculationDate=null, deleteFlag=null, REMARK=null, entInfoCount=1, perCertOtherCount=null, raPlStatCount=null, raBtStatCount=null, gcResPlCount=null, gcResBtCount=null, gcComCount=null, plBaseCount=null, plSectionCount=null, plNodeCount=null, plUrbanStatCount=null, plRuralStatCount=null, stationCount=null, plDeviceCount=null, emgPlanECount=null, emgPlanGCount=null, emgTeamCount=null, emgVehicleCount=null, emgDepotCount=null, emgMaterialCount=null, apmEntInfoCount=2, apmPerCertOtherCount=null, apmRaPlStatCount=null, apmRaBtStatCount=null, apmGcResPlCount=null, apmGcResBtCount=null, apmGcComCount=null, apmPlBaseCount=null, apmPlSectionCount=null, apmPlNodeCount=null, apmPlUrbanStatCount=null, apmPlRuralStatCount=null, apmStationCount=null, apmPlDeviceCount=null, apmEmgPlanECount=null, apmEmgPlanGCount=null, apmEmgTeamCount=null, apmEmgVehicleCount=null, apmEmgDepotCount=null, apmEmgMaterialCount=null, aprEntInfoCount=null, aprPerCertOtherCount=null, aprRaPlStatCount=null, aprRaBtStatCount=null, aprGcResPlCount=null, aprGcResBtCount=null, aprGcComCount=null, aprPlBaseCount=null, aprPlSectionCount=null, aprPlNodeCount=null, aprPlUrbanStatCount=null, aprPlRuralStatCount=null, aprStationCount=null, aprPlDeviceCount=null, aprEmgPlanECount=null, aprEmgPlanGCount=null, aprEmgTeamCount=null, aprEmgVehicleCount=null, aprEmgDepotCount=null, aprEmgMaterialCount=null, entName=null, entUuid=test01)]
![在这里插入图片描述](https://img-blog.csdnimg.cn/70e3abd7b9cc4e2cb2fb8953b71eb9a3.png)
核心方法
public static HashMap<String, Object> objectToMap(Object obj) {
HashMap<String, Object> map = new HashMap<>();
Field[] fields = obj.getClass().getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
String fieldName = field.getName();
try {
Object fieldValue = field.get(obj);
if (null != fieldValue) {
map.put(fieldName, fieldValue);
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
return map;
}
public static Object setValues(HashMap<String, Object> map, Object company) throws Exception {
System.out.println("map"+map);
Field[] fields = CaptureStatisticsCompany.class.getDeclaredFields();
for (Field field : fields) {
String fieldName = field.getName();
if (map.containsKey(fieldName) && !"serialVersionUID".equals(fieldName)) {
field.setAccessible(true);
Object value = map.get(fieldName);
field.set(company, value);
}
}
System.out.println("company"+company);
return company;
}
使用
![在这里插入图片描述](https://img-blog.csdnimg.cn/b0701d94e267447e90e7671ced55c65c.png)