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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 武剑峰 中级黑马   /  2012-6-13 09:23  /  1185 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

第一次我把类与main方法放入到一个里面,结果不用设置setAccessible(true);就可以直接访问了
这个大概是私有变量在本类中可以访问
于是我把main方法移到了另一个类中

发现我把公共的x变量写成 Field fieldx = vp.getClass().getDeclaredField("x");也没有报错,并且结果也正常。那既然getField()能实现的,getDeclaredField()都能实现,还能把受保护或私有的反射出来,那为什么还要用getField(),就是为了给自己枷锁吗?

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

3 个回复

倒序浏览
看来是没人深入探讨过???????????????
回复 使用道具 举报
  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没有这个说明。所以上面的代码中会报错。*/
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 武剑峰 于 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),也行啊???
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马