は配列des
のフィールドではないため、コードはあまり意味がありません。ただし、クラスの名前を値として持つだけで、クラスで宣言されたフィールドにアクセスしようとしているようです。はインスタンス フィールドであるため、操作するには のインスタンスが必要です。次のようなことができます。String
className
A
String
des
A
A a = (A) (Class.forName("A").newInstance());
System.out.println(a.des[0]);
これがスローする可能性のある潜在的な例外に対処するコードを追加する必要があります。また、 への引数Class.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];
}
}