黑马程序员技术交流社区
标题:
反射中的问题,求大神帮助
[打印本页]
作者:
孙涛00
时间:
2013-10-25 17:13
标题:
反射中的问题,求大神帮助
本帖最后由 孙涛00 于 2013-10-27 19:19 编辑
public class ReflectPoint {
private int x;
public int y;
public ReflectPoint(int x, int y) {
this.x = x;
this.y = y;
}
}
复制代码
import java.lang.reflect.Field;
public class ReflectTest {
/**
* @param args
* @throws NoSuchFieldException
* @throws SecurityException
*/
public static void main(String[] args) throws Exception, NoSuchFieldException {
// TODO Auto-generated method stub
ReflectPoint rPoint1 = new ReflectPoint(3, 5);//ReflectPoint对象1
ReflectPoint rPoint2 = new ReflectPoint(4, 6);//ReflectPoint对象2
//通过rPoint1得到的fieldX,FieldY
Field fieldY = rPoint1.getClass().getField("y");//根据变量名获得Field对象,用它去获取ReflectPoint类对象的y值
Field fieldX = rPoint1.getClass().getDeclaredField("x");//x为私有,发现所有能发现的成员,包括私有成员
fieldX.setAccessible(true);//设置 获取此对象的accessible的标志值为true,暴力反射
//rPoint1
System.out.println(fieldX.get(rPoint1));//结果3
System.out.println(fieldY.get(rPoint1));//结果5
//rPoint2
System.out.println(fieldX.get(rPoint2));//结果4
System.out.println(fieldY.get(rPoint2));//结果6
System.out.println(rPoint1.getClass()==rPoint2.getClass());//true
System.out.println(rPoint1.getClass().getField("y")==rPoint2.getClass().getField("y"));//false
}
}
复制代码
运行结果:
3
5
4
6
true
false
结果为什么是这样?为什么最后一个是false,而不是true?
System.out.println(rPoint1.getClass()==rPoint2.getClass());结果为true,说明用rPoint1和rPoint2得到是同一个ReflectPoint类的Class,但是
System.out.println(rPoint1.getClass().getField("y")==rPoint2.getClass().getField("y"));结果是false;说明通过同一个ReflectPoint类的Class,获取的rPoint1和rPoint2的Field对象不是同一个。
为什么?
张孝祥老师说过这里的FieldY不是对象本身上的变量,是类上的,要用它去取某个对象的值,那是不是可以说他能获取ReflectPoint的所有对象的y值,正好
//rPoint2
System.out.println(fieldX.get(rPoint2));//结果4
System.out.println(fieldY.get(rPoint2));//结果6
通过rPoint1得到的fieldX,FieldY能够得到rPoint2的x,y的值。不知道我这样理解对不对,但还是有上述为什么会得到false的疑问。
作者:
漫步人
时间:
2013-10-25 19:59
前几个问题你说分析的对!
至于为什么"System.out.println(rPoint1.getClass().getField("y")==rPoint2.getClass().getField("y"));结果是false;"?
Field fieldY = rPoint1.getClass().getField("y");//根据变量名获得Field对象,用它去获取ReflectPoint类对象的y,此时的y没有具体的数值,它只是个对象,
所以返回false;
希望对你有帮助!
作者:
杨增坤
时间:
2013-10-25 20:00
同求解释
作者:
杨增坤
时间:
2013-10-25 20:06
System.out.println(rPoint1.getClass().getField("y").getClass() == rPoint2.getClass().getField("y").getClass());
这样就是true,
rPoint1.getClass().getField("y")只表示对象,所以他们不相等,但是他们的字节码还是相等的。
作者:
未知数|X|
时间:
2013-10-25 20:43
本帖最后由 未知数|X| 于 2013-10-25 20:49 编辑
System.out.println(rPoint1.getClass().getField("y")==rPoint2.getClass().getField("y"));结果是false这个问题就像 String str=new String("abc"); String str1=new String("abc") 是str==str1,这个结果都知道肯定是false是不同的对象,如果把它改为str.equals(str1)这个结果肯定是true吧,rPoint1.getClass().getField("y")equals(rPoint2.getClass().getField("y"))这个结果也是true;因为每一个 ReflectPoint 对象本身都有一个y的方法你这样rPoint1.getClass().getField("y")取获取的是rPoint1对象上的y也就是两个Field对象但它们的返回内同是相同的,这样rPoint2.getClass().getField("y")获取的是rPoint2对象上的y,rPoint1.getClass()和rPoint2.getClass()同属于一个字节码对象所以你输出rPoint2.getClass()==rPoint1.getClass()为true,其实你要把它Field fieldY = rPoint1.getClass().getField("y");//改为 Field fieldY = ReflectPoint .class.getField("y");你就没有那么多疑惑了,以上纯属自己理解,如果有什么错敬请指出共同进步
作者:
孙涛00
时间:
2013-10-27 19:18
坤哥,懂了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2