リフレクションを使用して内部クラスのフィールド値にアクセスしようとしています。
クラスは次のとおりです。
public class OuterClass {
int a;
public class InnerClass {
int b;
InnerClass(int b){
this.b = b;
}
}
public void setInnerField(int val){
InnerClass a = new InnerClass(val);
}
}
そして、主な機能は次のとおりです。
OuterClass obj = new OuterClass();
obj.a = 10;
obj.setInnerField(5);
以下は、私が内部クラスのフィールド値、つまり b を取得しようとしているものです。java でリフレクションを使用して内部クラス変数の値にアクセスするにはどうすればよいですか?
Class[] classes = obj.getClass().getDeclaredClasses();
for(Class innerClass: classes){
//System.out.println(innerClass.getName());
Field[] fields = innerClass.getDeclaredFields();
for(Field field : fields){
//System.out.println(field.getName());
System.out.println(field.get(obj)); //<-----IllegalArgumentException
//Tried with below line too as suggested in above link
System.out.println(field.get(innerClass.getInterfaces())); //<-----IllegalArgumentException
}
}
では、実行時に内部クラスのフィールド値にアクセスする方法は何でしょう?
次の理由で、コードが IllegalArgumentException をスローします。
`System.out.println(field.get(obj));
System.out.println(field.get(innerClass.getInterfaces()));// your inner class does not implement any interfaces which result in [] as an arg`
get メソッドに渡す obj arg は、get を呼び出すフィールド (この場合は OuterClass$InnerClass) を宣言するのと同じタイプである必要があります。b
これは get メソッドについてすでに文書化されています。
指定されたオブジェクトが、基になるフィールドを宣言するクラスまたはインターフェイスのインスタンスでない場合、メソッドは IllegalArgumentException をスローします。
内部クラスとそのフィールドを静的として宣言するか、内部クラスのインスタンスがあり、内部クラスのフィールドでそれを呼び出すときに、それを arg として field.get( innerInstance ) に渡します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加