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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Alexander 中级黑马   /  2014-3-18 10:17  /  1152 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

今天在写一个反射程序的时候遇到这样一个情况:我在GetPerson类中用反射的方法调用Person类的成员变量x(int),打印是正确的,然后在GetPerson类中定义了成员变量y(int),用同样的方法却不能获取,不知道为什么,求教!!!

public class Person {
        int x = 1;
}


public class GetPerson {
       
        int y = 2;
       
        public static void main(String[] args) throws Exception {
                Person p = new Person();
               
                Field f = p.getClass().getField("x");
                //这里打印的结果为1
                System.out.println(f.get(p));
               
                GetPerson gp = new GetPerson();
                Field f1 = gp.getClass().getField("y");
                //这里会有异常,java.lang.NoSuchFieldException: x
                System.out.println(f1.get(gp));
        }


为什么呢?难道不能访问自己类的成员变量吗?

评分

参与人数 1技术分 +1 收起 理由
SyouRai_Tsk + 1

查看全部评分

4 个回复

倒序浏览
首先一点,你声明成员变量时为啥不加访问修饰符,反射的getField()方法只能获取public类型的,你的两个类型都是默认的包访问权限。必须使用getDeclaredField()才行:
  1.           Person p = new Person();
  2.                
  3.                // Field f = p.getClass().getField("x");
  4.                 Field f2 = p.getClass().getDeclaredField("x");
  5.                 //这里打印的结果为1
  6.                // System.out.println(f.get(p));
  7.                 System.out.println(f2.get(p));
  8.                
  9.                 GetPerson gp = new GetPerson();
  10.                 Field f1 = gp.getClass().getDeclaredField("y");
  11.                 //这里会有异常,java.lang.NoSuchFieldException: x
  12.                 System.out.println(f1.get(gp));
  13.         
复制代码

评分

参与人数 1技术分 +1 收起 理由
SyouRai_Tsk + 1

查看全部评分

回复 使用道具 举报
getField(String name) 只能获取public的成员变量,你的是default
回复 使用道具 举报
哦,失误了,没想到这点。。。。
回复 使用道具 举报
本帖最后由 刘一博 于 2014-3-18 10:50 编辑
  1. class Person {
  2.     public int x = 1;
  3. }

  4. public class GetPerson {

  5.     int y = 2;

  6.     public static void main(String[] args) throws Exception {
  7.         Person p = new Person();

  8.         Field f = p.getClass().getField("x");
  9.         //当person中的x为公有变量(public修饰)时,这里才会打印1,否则会报异常
  10.         System.out.println(f.get(p));

  11.         GetPerson gp = new GetPerson();
  12.         Field f1 = gp.getClass().getDeclaredField("y");
  13.         //对于可访问到的非公有变量(protected或默认修饰)变量,需采用getDeclaredField方法,否则会报异常
  14.         System.out.println(f1.get(gp));
  15.     }
  16. }
复制代码

解释在注释中

评分

参与人数 1技术分 +1 收起 理由
SyouRai_Tsk + 1

查看全部评分

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