首先我们来看下面一个方法,在讲解这个方法之前我们先来认识一下Api中的几个方法
第一个是java.lang.class<T>中的Field[] getDeclaredFields()
第二个是java.lava.Class<T>中的field getDeclaredFields()
第三个是java.lang.reflect.Field中的Class<?> getType()
第四个是java.lang.reflect.AccessibleObject中的void setAccessible(boolean flag)当值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。值为 false 则指示反射的对象应该实施 Java 语言访问检查。
第五个是java.lang.reflect.Field中的Object get(Object obj)
第六个是java.lang.reflect.Field中的void set(Object obj , Object value)
/** * * 功能:[VO反射封装]<br /> * 创建日期:Aug 9, 2018 15:40:15 PM <br /> * 功能说明:<br /> * 1.fromObj:存在数值的VO * 2.toObj:需要封装的VO * 用于历史写入 * */ public static void chanageObject(Object fromObj, Object toObj) { // 获得源对象的类模板 Class fromClass = fromObj.getClass(); // 获得目标对象的类模板 Class toClass = toObj.getClass(); // 获得源对象所有属性对象 Field[] fromObjs = fromClass.getDeclaredFields(); for (Field fromField : fromObjs) { try { // 忽略访问修饰符的检查 fromField.setAccessible(true); // 获得源对象属性的名字 String fromName = fromField.getName(); // 获得目标对象的属性,如果不存在,则抛出异常,继续循环 Field toField = toClass.getDeclaredField(fromName); toField.setAccessible(true); // 如果源对象的类型和目标对象的类型一至,则完成拷贝 if (fromField.getType() == toField.getType()) { // 从源对象中获得属性值,填充为目标对象相应的属性 toField.set(toObj, fromField.get(fromObj)); } } catch (Exception e) { continue; } } } |
测试用例:
步骤,先创建二个实体类A,B,将实体类A中和实体类B中相同字段类型和属性名一致,则把A属性对应的值拷贝到B对应的属性中,最后得到一个有值的实体B。
类A(PersonManVo)
public class PersonManVo { private java.lang.String name; private java.lang.Double heigth; private java.lang.Integer age; private java.util.Date birthday; public String getName() { return name; } public void setName(String name) { this.name = name; } public Double getHeigth() { return heigth; } public void setHeigth(Double heigth) { this.heigth = heigth; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public java.util.Date getBirthday() { return birthday; } public void setBirthday(java.util.Date birthday) { this.birthday = birthday; } @Override public String toString() { return "PersonManVo [name=" + name + ", heigth=" + heigth + ", age=" + age + ", birthday=" + birthday + "]"; } } |
类B(PersonWomenVo)
public class PersonWomenVo { private java.lang.String name; private java.lang.Double heigth; private java.lang.Integer age; private java.util.Date birthday; private java.lang.String hobby; public String getName() { return name; } public void setName(String name) { this.name = name; } public Double getHeigth() { return heigth; } public void setHeigth(Double heigth) { this.heigth = heigth; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public java.util.Date getBirthday() { return birthday; } public void setBirthday(java.util.Date birthday) { this.birthday = birthday; } public String getHobby() { return hobby; } public void setHobby(String hobby) { this.hobby = hobby; } @Override public String toString() { return "PersonWomenVo [name=" + name + ", heigth=" + heigth + ", age=" + age + ", birthday=" + birthday + ", hobby=" + hobby + "]"; } } |
初始化实体类A(PersonManVo)的类InitzeList:用于在执行测试用例之前,进行添加数据
/** * 初始化工具 * @author json.yang * */ public class InitzeList { protected static List<PersonManVo> list = new ArrayList<PersonManVo>(); //初始化添加peronManVo内容的方法 public static PersonManVo init(){ PersonManVo perManVo = new PersonManVo(); perManVo.setName("张三"); perManVo.setAge(20); perManVo.setHeigth(175d); perManVo.setBirthday(ObjectUtils.parseTimestamp("2017-08-25")); list.add(perManVo); return list.get(0); } } |
测试类:TestTransform
/** * 使用反射测试把一个实体添加到另外一个实体中 * @author json.yang * */ public class TestTransform{ private static PersonManVo personManVo= null; static{ InitzeList initzeList = new InitzeList(); personManVo = initzeList.init(); } public static void main(String[] args) { System.out.println(personManVo.toString()); PersonWomenVo personWomenVo = new PersonWomenVo(); ObjectUtils.chanageObject(personManVo, personWomenVo); System.out.println(personWomenVo.toString()); } } |