Java 反射:通过反射加载的类中的常量变量
我有一个类,它有一堆常量字符串 我需要通过反射加载这个类并检索这些常量。 我可以达到:Java 反射:通过反射加载的类中的常量变量,java,reflection,Java,Reflection,我有一个类,它有一堆常量字符串 我需要通过反射加载这个类并检索这些常量。 我可以达到: controllerClass = Class.forName(constantsClassName); Object someclass = controllerClass.newInstance(); 但是我对如何检索这个类中的字段感到困惑 通过类而不是对象引用了解修饰符 访问字段的快速示例-- 假设这些常量位于静态字段中: import java.lang.reflect.*; public cla
controllerClass = Class.forName(constantsClassName);
Object someclass = controllerClass.newInstance();
但是我对如何检索这个类中的字段感到困惑 通过类而不是对象引用了解修饰符
访问字段的快速示例--
假设这些常量位于静态字段中:
import java.lang.reflect.*;
public class Reflect {
public static final String CONSTANT_1 = "1";
public static final String CONSTANT_2 = "2";
public static final String CONSTANT_3 = "3";
public static void main(String[] args) throws Exception {
Class clazz = Class.forName("Reflect");
Field[] fields = clazz.getDeclaredFields();
for(Field f: fields) {
// for fields that are not visible (e.g. private)
f.setAccessible(true);
// note: get(null) for static field
System.err.printf("%s: %s\n",f, (String)f.get(null) );
}
}
}
输出为:
$ java Reflect
public static final java.lang.String Reflect.CONSTANT_1: 1
public static final java.lang.String Reflect.CONSTANT_2: 2
public static final java.lang.String Reflect.CONSTANT_3: 3
请注意,对于静态字段的值,您提供了
null
作为参数。以下是一个小示例:
import java.lang.reflect.Field;
public class Test {
public static class X {
public static int Y = 1;
private static int Z = 2;
public int x = 3;
private int y = 4;
}
public static Object getXField(String name, X object) {
try {
Field f = X.class.getDeclaredField(name);
f.setAccessible(true);
return f.get(object);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static void main(String[] args) {
System.out.println(Test.getXField("Y", null));
System.out.println(Test.getXField("Z", null));
System.out.println(Test.getXField("x", new X()));
System.out.println(Test.getXField("y", new X()));
}
}
运行这个小程序输出:
1
2
3
4
一些意见:
- 对于静态字段,提供给
的对象可以是Field.get()
null
- 为了简洁起见,我在基本的
类中使用了一个exception-catch-all-您应该在代码中使用显式的exception类exception
- 虽然
通常按预期工作,但Field.get()
及其好友却不能这样说。更具体地说,它将乐于更改常量的值(例如,Field.set()
字段,或在类方法中从未修改过的final
字段),但由于常量内联,旧值可能仍在使用private
1
2
3
4