一个反射问题

daryzhang 2010-01-19 05:28:22
JOptionPane.class.getField(s).getInt(null);

请问 getInt(null); 到底是个什么意思呢?

为什么我用个例子调试这个程序能编译 但运行会报找不到Field的错误呢?

public class Fan {
private final static int ZHANG = 99;
private final static int DONG = 88;
public static void main(String[] args) {
try {
System.out.println(Fan.class.getField("ZHANG").getInt(null));
}
catch(IllegalArgumentException e) {
e.printStackTrace();
}
catch(SecurityException e) {
e.printStackTrace();
}
catch(IllegalAccessException e) {
e.printStackTrace();
}
catch(NoSuchFieldException e) {
e.printStackTrace();
}
}
}
...全文
154 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
asdf666 2010-01-19
  • 打赏
  • 举报
回复
getField() 只能获取public属性的字段,本例中字段为private,无法获取,所以会抛NoSuchFieldException。
此处应该用getDeclaredField()方法来获取:
Field f = Fan.class.getDeclaredField("ZHANG");
在调用getInt(null)方法之前,必须去掉java的访问控制检查(因为字段为private属性,外部不能访问,否则会抛IllegalAccessException),通过调用方法:f.setAccessible(true);
此时调用f.getInt(null)结果为99。
另:getInt(Object obj),参数obj为所要从其内部获取字段值的那个类实例,本例中字段属性为static,不需要类实例,可以用null来代替。
hongjn 2010-01-19
  • 打赏
  • 举报
回复
补充:也可以不用getInt(),直接System.out.println(field.get("ZHANG"));
hongjn 2010-01-19
  • 打赏
  • 举报
回复
楼主请看

Field field = Fan.class.getDeclaredField("ZHANG");
field.setAccessible(true);
System.out.println(field.getInt("ZHANG"));
-封宇- 2010-01-19
  • 打赏
  • 举报
回复
学习 ~~~~~
smartcatiboy 2010-01-19
  • 打赏
  • 举报
回复
getField是对整个类而言
但是值只有在单一对象中才存在
所以在getInt时要指定目标对象

打个比方说:

人类都有“名字”的属性
但是人类的“名字”确没有一个值,只有人类中的某个人,daryzhang的名字叫楼主

class Human{Name};
Human Lz=new Human("daryzhang");
system.out.printf(human.getclass().getField("name").getString(Lz)=="daryzhang");
树成 2010-01-19
  • 打赏
  • 举报
回复
static变量当然能够用反射获得,不然反射还有什么意义?

私有变量通过反射当然也可以获得,但是安全性方面其实是不用担心的,运行时虚拟机内部会检测安全机制。
luffyke 2010-01-19
  • 打赏
  • 举报
回复
getInt(null)说明这个field是static!而static 变量不能用反射获得的
xlxyeyu 2010-01-19
  • 打赏
  • 举报
回复
嗯?私有变量也可以通过反射获取?那岂不是无敌了~~~

我到网上看看,虽然楼上可以用getDeclaredField来获取,但我总感觉这样一来问题就大发了~~~
临远 2010-01-19
  • 打赏
  • 举报
回复
额外说明一下,private的field,需要使用getDeclaredField来获得。

getInt(null)说明这个field是static。
临远 2010-01-19
  • 打赏
  • 举报
回复
System.out.println(Fan.class.getDeclaredField("ZHANG").getInt(null));

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧