A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 孙涛00 中级黑马   /  2013-10-25 17:13  /  1245 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 孙涛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的疑问。

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

5 个回复

倒序浏览
前几个问题你说分析的对!
至于为什么"System.out.println(rPoint1.getClass().getField("y")==rPoint2.getClass().getField("y"));结果是false;"?
Field fieldY = rPoint1.getClass().getField("y");//根据变量名获得Field对象,用它去获取ReflectPoint类对象的y,此时的y没有具体的数值,它只是个对象,
所以返回false;
希望对你有帮助!

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

回复 使用道具 举报
同求解释
回复 使用道具 举报
System.out.println(rPoint1.getClass().getField("y").getClass() == rPoint2.getClass().getField("y").getClass());




这样就是true,
rPoint1.getClass().getField("y")只表示对象,所以他们不相等,但是他们的字节码还是相等的。
回复 使用道具 举报
本帖最后由 未知数|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");你就没有那么多疑惑了,以上纯属自己理解,如果有什么错敬请指出共同进步

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

回复 使用道具 举报
坤哥,懂了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马