黑马程序员技术交流社区

标题: 关于字段反射的疑问 [打印本页]

作者: 武剑峰    时间: 2012-6-13 09:23
标题: 关于字段反射的疑问
第一次我把类与main方法放入到一个里面,结果不用设置setAccessible(true);就可以直接访问了
这个大概是私有变量在本类中可以访问
于是我把main方法移到了另一个类中

发现我把公共的x变量写成 Field fieldx = vp.getClass().getDeclaredField("x");也没有报错,并且结果也正常。那既然getField()能实现的,getDeclaredField()都能实现,还能把受保护或私有的反射出来,那为什么还要用getField(),就是为了给自己枷锁吗?
作者: 武剑峰    时间: 2012-6-13 10:09
看来是没人深入探讨过???????????????
作者: 赵兵锋    时间: 2012-6-13 12:22
  1. class T{
  2.         public int x=10;
  3. }
  4. class TT extends T{
  5. }
  6. public class Main{
  7.          public static void main(String[] as) {
  8.                  TT t = new TT();
  9.                  try {
  10.                         System.out.println(t.getClass().getField("x").getInt(t));
  11.                         System.out.println(t.getClass().getDeclaredField("x").getInt(t));
  12.                 } catch (IllegalArgumentException e) {
  13.                         e.printStackTrace();
  14.                 } catch (SecurityException e) {
  15.                         e.printStackTrace();
  16.                 } catch (IllegalAccessException e) {
  17.                         e.printStackTrace();
  18.                 } catch (NoSuchFieldException e) {
  19.                         e.printStackTrace();
  20.                 }
  21.                  
  22.          }
  23. }
  24. /*
  25. 输出:
  26. 10
  27. java.lang.NoSuchFieldException: x
  28.         at java.lang.Class.getDeclaredField(Unknown Source)
  29.         at Main.main(Main.java:11)
  30. 再查API,可以看到getField里特别说明了:
  31. 要反射的字段由下面的算法确定。设 C 为此对象所表示的类:
  32. 1.如果 C 声明一个带有指定名的公共字段,则它就是要反映的字段。
  33. 2.如果在第 1 步中没有找到任何字段,则该算法被递归地应用于 C 的每一个直接超接口。直接超接口按其声明顺序进行搜索。
  34. 3.如果在第 1、2 两步没有找到任何字段,且 C 有一个超类 S,则在 S 上递归调用该算法。如果 C 没有超类,则抛出 NoSuchFieldException。
  35. 而getDeclaredField没有这个说明。所以上面的代码中会报错。*/
复制代码

作者: 武剑峰    时间: 2012-6-13 15:15
本帖最后由 武剑峰 于 2012-6-13 15:34 编辑
赵兵锋 发表于 2012-6-13 12:22


t.getClass().getField("x").getInt(t));你好能具体说说这个吗,我只能看懂t.getClass().getField("x"),后边怎么又跟了个getInt(t),我记的老师讲课用的是t.getClass().getField("x").get(t);怎么在这里你用getInt(t),也行啊???




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2