日期:2014-05-20  浏览次数:20748 次

关于反射的Field,求大神解释。
[code=Java][/code]

import java.lang.reflect.Field;


public class ReflectTest {

/**
* @param args
*/
public static void main(String[] args)throws Exception {
// TODO Auto-generated method stub
ReflectPoint pt = new ReflectPoint(2,4); //定义类(我的问题)
changeString(pt);
System.out.println(pt);
}

public static void changeString(Object obj)throws Exception{ //将字符‘l’改成字符‘k’.
Field[] fields = obj.getClass().getFields();
for(Field field:fields){
if(field.getType()==String.class){
String oldString =(String)field.get(obj);
String newString = oldString.replace("l", "k");
field.set(obj, newString);
}
}

}


}



public class ReflectPoint {
private int x; //定义点
public int y;
public String s1 = "all"; //定义字符串.
public String s2 = "kill";
public ReflectPoint(int x, int y) { //为点构造函数.
super();
this.x = x;
this.y = y;
}

public String toString(){
return s1+" :"+s2;
}
}
问:在“我的问题”那里,pt是不是对应类ReflectPoint中的任何字段,而不是对应int x 和int y字段?
怎么在changeString方法中传递pt 而已,都可以改变构造函数ReflectPoint之外的成员s1 和s2···
谢谢!!!

------解决方案--------------------
fields对应类的所有字段,反射是得到类运行时的对象(类的引用,或者说地址),如果对类的属性(引用类型)进行改变,原来对象的属性也会改变!传递pt,相当于按地址传递,而非按值传递!
------解决方案--------------------
Field[] fields = obj.getClass().getFields();
getFields这个方法是获取clss中所有public的Field,s1 和s2在这个类当中自然会被获取出来的。自己好好去看看API手册
------解决方案--------------------
在“我的问题”那里,pt是不是对应类ReflectPoint中的任何字段,而不是对应int x 和int y字段?
这句没看明白.

怎么在changeString方法中传递pt 而已,都可以改变构造函数ReflectPoint之外的成员s1 和s2···
Field[] fields = obj.getClass().getFields();这样不是已经获取到其他的成员了么?