黑马程序员技术交流社区

标题: 反射中的问题,求大神帮助 [打印本页]

作者: 孙涛00    时间: 2013-10-25 17:13
标题: 反射中的问题,求大神帮助
本帖最后由 孙涛00 于 2013-10-27 19:19 编辑
  1. public class ReflectPoint {

  2.         private int x;
  3.         public int y;
  4.         public ReflectPoint(int x, int y) {
  5.                 this.x = x;
  6.                 this.y = y;
  7.         }
  8.         
  9. }
复制代码
  1. import java.lang.reflect.Field;
  2. public class ReflectTest {

  3.         /**
  4.          * @param args
  5.          * @throws NoSuchFieldException
  6.          * @throws SecurityException
  7.          */
  8.         public static void main(String[] args) throws Exception, NoSuchFieldException {
  9.                 // TODO Auto-generated method stub
  10.                  ReflectPoint rPoint1 = new ReflectPoint(3, 5);//ReflectPoint对象1
  11.                  ReflectPoint rPoint2 = new ReflectPoint(4, 6);//ReflectPoint对象2
  12.                  
  13.                  //通过rPoint1得到的fieldX,FieldY
  14.                  Field fieldY = rPoint1.getClass().getField("y");//根据变量名获得Field对象,用它去获取ReflectPoint类对象的y值
  15.                  Field fieldX = rPoint1.getClass().getDeclaredField("x");//x为私有,发现所有能发现的成员,包括私有成员
  16.                  fieldX.setAccessible(true);//设置  获取此对象的accessible的标志值为true,暴力反射
  17.                  
  18.                  //rPoint1
  19.                  System.out.println(fieldX.get(rPoint1));//结果3
  20.                  System.out.println(fieldY.get(rPoint1));//结果5
  21.                  //rPoint2
  22.                  System.out.println(fieldX.get(rPoint2));//结果4
  23.                  System.out.println(fieldY.get(rPoint2));//结果6
  24.                  
  25.                  System.out.println(rPoint1.getClass()==rPoint2.getClass());//true
  26.                  System.out.println(rPoint1.getClass().getField("y")==rPoint2.getClass().getField("y"));//false
  27.                  
  28.         }

  29. }
复制代码
运行结果:
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