Java基础笔记 - 通过反射机制动态获取属性的值模拟Struts的自动赋值

准备知识:

Java反射机制 处理事务的JavaBean String的操作常用方法

这里我们通过反射机制动态获取属性的值模拟Struts中的自动赋值。

首先创建一个简单的User类包含两个属性username和userid以及getter、setter方法:

class User {
public User(){}

private String username;

private String userid;

public String getUserid() {
    return userid;
}

public void setUserid(String userid) {
    this.userid = userid;
}

public String getUsername() {
    return username;
}

public void setUsername(String username) {
    this.username = username;
}

}

接下来创建User类的对象user1,然后通过反射机制动态把user1对象的所有属性赋值给新建的user2:

//创建user1对象
User user1 = new User();
user1.setUsername(“arthinking”);
user1.setUserid(“001”);
String username = “arthinking”;
String userid = “001”;

//通过user1对象获取Class
Class<?> classType = user1.getClass();

//生成user2对象
Object user2 = classType.getConstructor(new Class[]{}).newInstance(new Object[]{});

//从user1对应的Class对象中获取所有的属性
Field[] fields = classType.getDeclaredFields();
for(int i=0; i<fields.length; i++){

Field field = fields\[i\];
//动态生成getter和setter方法
String fieldName = field.getName();
String firstChar = fieldName.substring(0,1).toUpperCase();
String getterName = "get" + firstChar + fieldName.substring(1);
String setterName = "set" + firstChar + fieldName.substring(1);
Method getter = classType.getMethod(getterName);
Method setter = classType.getMethod(setterName, new Class\[\]{field.getType()});

//执行getter方法获取当前域的值
Object result = getter.invoke(user1);
//执行setter给user2赋值
setter.invoke(user2, new Object\[\]{result});

}

arthinking wechat
欢迎关注itzhai公众号