用反射的形式将一个对象属性值赋值给另一个对象,省略点get/set方法的冗余代码
1.本例使用的是idea
首先需要在idea中安装lombok插件,省略getter和setter方法的书写
在maven项目中加入lombok依赖
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.10</version> </dependency>
2.建立两个实体类:
import lombok.Data; /** * @author yangchao * @version V1.0 * @Description: 第一个测试实体类:作为资源实体类 * @date 2018/10/9 */ @Data public class FirstPerson { private String name; private int age; }
import lombok.Data; import java.math.BigDecimal; /** * @author yangchao * @version V1.0 * @Description: 第一个测试实体类:作为目标实体类 * @date 2018/10/9 */ @Data public class SecondPerson { private String name; private int age; private BigDecimal cost; }
3.利用反射进行对象之间字段的转换工具:
/** * @author yangchao * @return void * @date 2018/10、9 * @Description: 将srcObj对象字段的值拷贝到destObj字段(前提:两个对象中的字段名相同时) * 其实就是通过反射将值先存在map中,在遍历set进目标对象 */ public static void copyFieldToBean(Object srcObj,Object destObj){ Map<String, Object> srcMap = new HashMap<String, Object>(); Field[] srcFields = srcObj.getClass().getDeclaredFields(); for (Field srcField : srcFields) { try { srcField.setAccessible(true); srcMap.put(srcField.getName(), srcField.get(srcObj)); //获取属性值 } catch (Exception e) { e.printStackTrace(); } } Field[] destFields = destObj.getClass().getDeclaredFields(); for (Field destField : destFields) { destField.setAccessible(true); if (srcMap.get(destField.getName()) == null) { continue; } try { destField.set(destObj, srcMap.get(destField.getName())); //给属性赋值 } catch (Exception e) { e.printStackTrace(); } } }
4.测试方法和结果:
public static void main(String[] args) { FirstPerson firstPerson = new FirstPerson(); SecondPerson secondPerson = new SecondPerson(); firstPerson.setAge(20); firstPerson.setName("张三"); copyFieldToBean(firstPerson,secondPerson); Field[] fds = secondPerson.getClass().getDeclaredFields(); for (Field fd : fds) { try { fd.setAccessible(true); System.out.println(fd.getName() + "=" + fd.get(secondPerson)); } catch (Exception e) { e.printStackTrace(); } } }
name=张三 age=20 cost=null