您的位置:首页 > 其它

反射 --- 成员变量Field类的反射

2011-11-13 15:49 211 查看
1.Field类代表某个类中的所有成员变量的集合

实例1:

public class ReflectPoint {

private int x;//私有成员变量

public int y;
//公有成员变量

public ReflectPoint(int x, int y) {

super();

this.x = x;

this.y = y;

}

}

ReflectPoint pt1 = new ReflectPoint(3, 5); //创建两个实例对象

ReflectPoint pt2 = new ReflectPoint(4, 6);

Field fieldY = ReflectPoint.class.getField("y");
//Field类对象fieldY -----> ReflectPoint 中的 y 成员变量

System.out.println(fieldY.get(pt1)); //输出fieldY.get(pt1)的值,5

System.out.println(fieldY.get(pt2)); //输出fieldY.get(pt2)的值,6

Field fieldX = ReflectPoint.class.getDeclaredField("x");//Field类对象fieldX -----> ReflectPoint 中的x 成员变量,此变量是私有成员,所以用getDeclaredField("x")方法

fieldX.setAccessible(true); //将fieldX变为可见,因为私有成员变量 x 不可见

System.out.println(fieldX.get(pt1)); //输出fieldX.get(pt1)的值,3

System.out.println(fieldX.get(pt2)); //输出fieldX.get(pt2)的值,4

实例2:

public class ReflectPoint {

public String str1 = "ball";

public String str2 = "basketball";

public String str3 = "back";

@Override

public String toString() {

return "ReflectPoint [str1=" + str1 + ", str2=" + str2 + ", str3="

+ str3 + "]";

}

}

private static void changeStringValue(Object obj) throws Exception {//将对象字符串中的'b'字母改为'a'

// TODO Auto-generated method stub

Field [] fields = ReflectPoint.class.getFields();//Field数组

for(Field field:fields){//增强型的for循环

if(field.getType() == String.class){//此处用 == 不用equals(),因为String类型的字节码只有一个

String oldString = (String)field.get(obj);

String newString = oldString.replace('b', 'a');

field.set(obj, newString);//将对象中的String类型成员变量的值变为新的值

}

}

ReflectPoint pt1 = new ReflectPoint(3, 5);

changeStringValue(pt1);

System.out.println(pt1);//输出ReflectPoint [str1=aall, str2=aasketaall, str3=aack]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: