【问题标题】:Getting value of public static final field/property of a class in Java via reflection通过反射获取Java中类的公共静态最终字段/属性的值
【发布时间】:2018-11-09 21:48:53
【问题描述】:

假设我有一堂课:

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

如何通过反射获得“_1st”的值?

【问题讨论】:

  • R._1st 无法工作?如果您在谈论 Android 开发,我认为 R 类始终存在...
  • @Matthieu 我也这么认为,直到今天我不得不做同样的事情,但仅限于 BR 类。

标签: java reflection static final


【解决方案1】:

首先检索类的字段属性,然后您可以检索值。如果您知道类型,则可以使用带有 null 的 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));
}...

【讨论】:

  • 谢谢。我试过了,但没有用。操作 f.getInt(null) 时抛出异常。抓到了,怎么会有异常?
  • 你收到了什么样的异常?
  • 您好,异常 e.getMessage() 返回字段名称,即“_1st”,仅此而已。
  • 但是异常的类型是什么? (即 NullPointerException、SecurityException、...)
  • 为什么文档从来没有提到getInt() 忽略传入的参数?花了几个小时试图让类的实例通过那里。
【解决方案2】:
 R.class.getField("_1st").get(null);

异常处理留给读者练习。

基本上,您可以像其他任何方式一样通过反射获得该字段,但是当您调用 get 方法时,您会传入一个 null,因为没有实例可操作。

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

【讨论】:

  • 我明白了。我需要的课程实际上是 R.id。感谢您的帮助!
【解决方案3】:

我遵循相同的路线(查看生成的 R 类),然后我有一种可怕的感觉,它可能是 Resources 类中的一个函数。我是对的。

发现这个: Resources::getIdentifier

认为它可能会为人们节省一些时间。尽管他们在文档中表示不鼓励这样做,但这并不奇怪。

【讨论】:

  • 所以你推断这是一个Android问题。应该在标签中注明...
  • 这不是 Android 问题,而是使用特定示例的 Java 反射问题。问题会根据主题进行标记。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-19
  • 1970-01-01
相关资源
最近更新 更多