黑马程序员技术交流社区
标题:
一个关于的反射问题
[打印本页]
作者:
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()才行:
Person p = new Person();
// Field f = p.getClass().getField("x");
Field f2 = p.getClass().getDeclaredField("x");
//这里打印的结果为1
// System.out.println(f.get(p));
System.out.println(f2.get(p));
GetPerson gp = new GetPerson();
Field f1 = gp.getClass().getDeclaredField("y");
//这里会有异常,java.lang.NoSuchFieldException: x
System.out.println(f1.get(gp));
复制代码
作者:
歌尽繁华
时间:
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 编辑
class Person {
public 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");
//当person中的x为公有变量(public修饰)时,这里才会打印1,否则会报异常
System.out.println(f.get(p));
GetPerson gp = new GetPerson();
Field f1 = gp.getClass().getDeclaredField("y");
//对于可访问到的非公有变量(protected或默认修饰)变量,需采用getDeclaredField方法,否则会报异常
System.out.println(f1.get(gp));
}
}
复制代码
解释在注释中
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2