简要说明:
该段代码通过一个简单的例子来说明如何利用反射机制来实现修改对象属性的值,适合刚刚接触反射的人阅览,高手勿喷。示例共有两个,区别在于类的属性第一个是public的,第二段是private的。
下面是详细代码:
1、利用getFields方法访问类的public属性字段
package reflection;
import java.lang.reflect.Field;
/**
* @author ye
* 把类所有String类型的变量中的b换成a
*/
public class ReflectionTest {
//<span style="color:#FFFFFF;"><span style="background-color: rgb(255, 0, 0);">此处必须是public,后面讲解</span></span>
public String s1="I'm b";
public String s2="take a bus";
public int a=3;
public static void main(String[] args) {
ReflectionTest rt = new ReflectionTest();//实例化类对象
Field[] fields = rt.getClass().getFields();//拿到类字节码中所有的Field,<span style="color:#FFFFFF;"><span style="background-color: rgb(255, 102, 102);">该方法只能访问public属性的字段,应用价值并不大。</span></span>
for (int i = 0; i < fields.length; i++) {//对Field进行遍历
if(fields[i].getGenericType()==String.class){//判断Field是否为String.class
Field f = fields[i];
try {
String value = (String) f.get(rt);//拿到rt对象中Field对应的属性值
value = value.replace("b", "a");//替换所有的字符b为字符a
f.set(rt, value);//为对象rt对应的属性设置新的值
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
System.out.println(rt);//打印对象,可以看到字符替换成功
}
@Override
public String toString() {
return "ReflectionTest [a=" + a + ", s1=" + s1 + ", s2=" + s2 + "]";
}
}
2、利用getDeclaredFields方法访问各种访问权限的字段
package reflection;
import java.lang.reflect.Field;
/**
* @author ye
* 把类所有String类型的变量中的b换成a
*/
public class ReflectionTest2 {
private String s1="I'm b";
private String s2="take a bus";
private int a=3;
public static void main(String[] args) {
ReflectionTest2 rt = new ReflectionTest2();//实例化类对象
Field[] fields = rt.getClass().getDeclaredFields();//拿到类字节码中所有的Field,可以访问所有访问权限的字段
for (int i = 0; i < fields.length; i++) {//对Field进行遍历
if(fields[i].getGenericType()==String.class){//判断Field是否为String.class
Field f = fields[i];
try {
String value = (String) f.get(rt);//拿到rt对象中Field对应的属性值
value = value.replace("b", "a");//替换所有的字符b为字符a
f.set(rt, value);//为对象rt对应的属性设置新的值
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
System.out.println(rt);//打印对象,可以看到字符替换成功
}
@Override
public String toString() {
return "ReflectionTest [a=" + a + ", s1=" + s1 + ", s2=" + s2 + "]";
}
}