黑马程序员技术交流社区

标题: 一个关于的反射问题 [打印本页]

作者: Alexander    时间: 2014-3-18 10:17
标题: 一个关于的反射问题
今天在写一个反射程序的时候遇到这样一个情况:我在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));
        }


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

作者: 房建斌    时间: 2014-3-18 10:32
首先一点,你声明成员变量时为啥不加访问修饰符,反射的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.         
复制代码

作者: 歌尽繁华    时间: 2014-3-18 10:36
getField(String name) 只能获取public的成员变量,你的是default
作者: Alexander    时间: 2014-3-18 10:38
哦,失误了,没想到这点。。。。
作者: 刘一博    时间: 2014-3-18 10:46
本帖最后由 刘一博 于 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. }
复制代码

解释在注释中




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