此处运用反射机制实现改变对象的属性值的功能。
以下代码实现功能为:
对一个对象中属性类型为String的字段,如果其值不是为"cloud",则将其改成"cloud"。我觉得实现的功能很简单,但很有指导性的意义。读者慢慢体会吧。
ReflectBean代码:
package com.cloud.reflect;
public class ReflectBean {
private String name;
private String password;
private int age;
public ReflectBean(String name, String password) {
super();
this.name = name;
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return this.name + ":::" + this.password;
}
}
ReflectTest代码:
package com.cloud.reflect;
import java.lang.reflect.Field;
public class ReflectTest {
public static void main(String[] args) throws Exception {
ReflectBean reflect = new ReflectBean("chris", "cloud");
changeFieldValue(reflect);
System.out.println(reflect.toString());
}
public static void changeFieldValue(Object obj) throws Exception {
Field[] fields = obj.getClass().getDeclaredFields();
for (Field field : fields) {
//由于字段是private类型,为了能够访问,进行“暴力”反射设置
field.setAccessible(true);
//此处应该用“==”为好,因为字节码只有一份
if (field.getType() == String.class) {
String oldStr = (String) field.get(obj);
if (!"cloud".equals(oldStr)) {
field.set(obj, "cloud");
}
}
}
}
}