说我有课:
public class R {
public static final int _1st = 0x334455;
}
如何通过反射获得“_ 1st”的值?
答案 0 :(得分:110)
首先检索类的field属性,然后可以检索该值。如果您知道类型,则可以使用其中一个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));
}...
答案 1 :(得分:56)
R.class.getField("_1st").get(null);
异常处理留给读者练习。
基本上你通过反射得到的字段就像任何其他字段一样,但是当你调用get方法时,你传递的是null,因为没有实例可以作用。
这适用于所有静态字段,无论它们是最终的。如果该字段不是公共字段,则需要首先在其上调用setAccessible(true)
,当然SecurityManager必须允许所有这些。
答案 2 :(得分:1)
我遵循相同的路线(查看生成的R类)然后我有这种可怕的感觉它可能是Resources类中的一个函数。我是正确的。
发现这个: Resources::getIdentifier
认为它可能会节省一些时间。虽然他们说它在文档中气馁,但这并不太令人惊讶。