如何通过反射获得另一个包的类中静态字段的值

时间:2017-11-08 09:28:16

标签: java reflection

如何在另一个包中获得静态字段的值?

我需要知道string类或类似的.R值。 我尝试使用这样的东西:

Class.forName("com.notmypackage.R$string").getDeclaredFields();

或详细案例:

for (Field field : Class.forName("com.android.webview.R$string").getDeclaredFields()) {
}

但没有成功,得到例外:

11-08 10:02:38.038 4983-4983/com.mypack W/System.err: java.lang.ClassNotFoundException: com.android.webview.R$string
11-08 10:02:38.038 4983-4983/com.mypack W/System.err:     at java.lang.Class.classForName(Native Method)
11-08 10:02:38.038 4983-4983/com.mypack W/System.err:     at java.lang.Class.forName(Class.java:309)
11-08 10:02:38.038 4983-4983/com.mypack W/System.err:     at java.lang.Class.forName(Class.java:273)

有没有办法获得外来***.R$string值?

1 个答案:

答案 0 :(得分:1)

您可以通过以下方式获取类的静态字段:

Field[] fields= Class.forName("com.android.webview.R").getDeclaredFields();
List<Field> staticFields = new ArrayList<Field>();
for (Field field : fields) {
    if (java.lang.reflect.Modifier.isStatic(field.getModifiers())) {
        // if you want to get String fields, check this
        // field.getType().equals(String.class)
        staticFields.add(field);
    }
}

或指定字段名称:

Field field= Class.forName("com.android.webview.R").getDeclaredField("field");

然后得到价值:

System.out.println(field.get(null));

抛出IllegalArgumentException, IllegalAccessException, SecurityException, ClassNotFoundException