我有一个有一堆常量字符串的类。
我需要通过反射加载这个类并检索这些常量。 我可以起床:
controllerClass = Class.forName(constantsClassName);
Object someclass = controllerClass.newInstance();
但我对如何检索此类中的字段感到困惑。
答案 0 :(得分:5)
访问字段的快速示例 -
Field[] fields = controllerClass.getDeclaredFields();
for ( Field field : fields ) {
field.setAccessible(true);
System.out.println(field.get(someClass));
}
答案 1 :(得分:2)
这是一个小样本:
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 - 您应该在代码中使用显式异常类。
虽然Field.get()
通常按预期工作,但Field.set()
及其朋友也不能这样说。更具体地说,它将愉快地更改常量的值(例如,在类方法中从未修改过的final
字段或private
字段),但由于常量内联,旧值可能保留在使用
答案 2 :(得分:1)
假设这些常量在静态字段中:
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 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
请注意,要get静态字段的值,请提供null
作为参数。
答案 3 :(得分:0)
您可以通过类而不是对象引用来了解修饰符。
http://download.oracle.com/javase/tutorial/reflect/class/classModifiers.html