通过反射获取Java中公共静态最终字段/属性的值

Vie*_*iet 86 java reflection static final

说我有一节课:

public class R {
    public static final int _1st = 0x334455;
}
Run Code Online (Sandbox Code Playgroud)

如何通过反射得到字段/属性"_1st"的值?

M. *_*sup 118

首先检索类的字段属性,然后可以检索该值.如果您知道类型,则可以使用其中一个get方法(仅对于静态字段,实际上对于静态字段,将完全忽略传递给get方法的参数).否则,您可以使用getType并编写适当的开关,如下所示:

Field f = R.class.getField("_1st");
Class<?> t = f.getType();
if(t == int.class){
    System.out.println(f.getInt(null));
}else if(t == double.class){
    System.out.println(f.getDouble(null));
}...
Run Code Online (Sandbox Code Playgroud)

  • 为什么文档从未提到`getInt()`忽略传入的参数?花了好几个小时试图让类的实例通过那里. (2认同)

Yis*_*hai 61

 R.class.getField("_1st").get(null);
Run Code Online (Sandbox Code Playgroud)

异常处理留给读者练习.

基本上你通过反射得到的字段就像任何其他字段一样,但是当你调用get方法时,你传递的是null,因为没有实例可以作用.

这适用于所有静态字段,无论它们是最终的.如果该字段不是公共字段,则需要先调用setAccessible(true)它,当然SecurityManager必须允许所有这些.

  • @Viet,你能澄清哪些不起作用吗?也许发布你没有工作的代码? (2认同)