java中反射的使用(一)

首先我们来看下面一个方法,在讲解这个方法之前我们先来认识一下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());

}

}

猜你喜欢

转载自blog.csdn.net/qq_37969990/article/details/81539502