2010-04-21 46 views
68

说我有一个类:通过反射获取一个类的公共静态最终字段/属性的值在Java中

public class R { 
    public static final int _1st = 0x334455; 
} 

我怎样才能获得通过反射的字段/属性“_1st”的价值?

+0

'R._1st'无法正常工作?如果你正在谈论Android的开发,我认为'R'类总是在那里...... – Matthieu 2015-04-23 15:03:00

+0

@Matthieu我也这么认为,直到今天,我必须做同样的事情,但只有'BR'类。 – Sevastyan 2017-11-08 16:08:57

回答

94

首先检索该类的字段属性,然后可以检索该值。如果知道类型,可以使用其中一个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)); 
}... 
+0

谢谢。我试过了,但没有奏效。在f.getInt(null)操作中引发异常。我发现了,但是怎么会有一个例外? – Viet 2010-04-21 18:26:24

+1

你收到了什么样的例外? – 2010-04-21 18:35:45

+0

嗨,异常e.getMessage()返回字段名称,这是“_1st”,没有别的。 – Viet 2010-04-21 18:41:03

42
R.class.getField("_1st").get(null); 

异常处理作为练习留给读者。

基本上你通过反射得到像其他任何其他字段,但是当你调用get方法时,你传递一个null值,因为没有实例需要执行。

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

+0

谢谢,但它并没有帮助... – Viet 2010-04-21 18:25:29

+2

@Viet,你能澄清一下没有用吗?也许发布你的代码不工作? – Yishai 2010-04-21 18:37:27

+0

嗨,异常e.getMessage()返回字段名称,这是“_1st”,没有别的。 – Viet 2010-04-21 18:41:32

1

我沿着相同的路线(通过生成的R类别看),然后我有这种可怕的感觉,这可能是在资源类中的函数。我是对的。

发现这一点: Resources::getIdentifier

认为这可能救人一段时间。尽管他们对文件表示不鼓励,但这并不令人感到意外。

+0

适合从其他apks读取资源 – schwiz 2014-07-09 19:30:36

+0

因此,您推断这是一个Android问题。应该在标签中注明... – Matthieu 2015-04-23 15:03:58

+0

这不是一个Android问题,它是一个使用特定示例的Java反射问题。问题根据他们的主题进行标记。 – 2016-12-19 17:05:26

相关问题