您的代码没有多大意义,因为des
不是String
array的字段className
。但是,您似乎正试图访问A
仅基于将类的名称作为String
值而在类中声明的字段。由于des
是一个实例字段,因此您需要一个实例A
来使用。你可以这样做:
A a = (A) (Class.forName("A").newInstance());
System.out.println(a.des[0]);
您必须添加代码来处理这可能引发的潜在异常。另请注意,参数 toClass.forName
需要是类的全名,所以如果A
是包的一部分(比如com.example
),那么它必须是Class.forName("com.example.A")
.
以下是如何将 Sotirios Delimanolis 和我的代码组合成一个完整的工作示例:
class Example {
static class A {
String[] des = { "Hi from class A" };
}
static class B {
String[] des = { "Hi from Class B" };
}
public static void main(String[] args) {
String[] classNames = { "Example$A", "Example$B" }; // inner class names
for (String name : classNames) {
try {
System.out.println(getDes0(name));
} catch (Exception e) {
System.err.println("Could not get des[0] for class " + name);
e.printStackTrace();
}
}
}
private static String getDes0(String className)
throws Exception // better to be explicit, but distracts from the answer
{
Class<?> cls = Class.forName(className);
Field field = cls.getDeclaredField("des");
Object obj = cls.newInstance();
String[] des = (String[]) field.get(obj);
return des[0];
}
}