このフィールドのメソッドを実行するために、Javaリフレクションを使用して汎用フィールド属性のインスタンスを取得しようとしています。Javaリフレクション 'Can not set'エラー
たとえば、getValue()メソッドを持つMyType型のクラスがあり、MyTypeクラスの属性を持つ別のクラスのMyContainerがある場合、このフィールドを動的に取得してgetValue()メソッドを実行し、方法。これは可能ですか?次のコード構造で
、私は取得しています:Exception in thread "main" java.lang.IllegalArgumentException: Can not set test.MyType field test.MyContainer.field1 to test.MyType
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:58)
at sun.reflect.UnsafeObjectFieldAccessorImpl.get(UnsafeObjectFieldAccessorImpl.java:36)
at java.lang.reflect.Field.get(Field.java:393)
at test.Main.main(Main.java:24)
MyContainer
public class MyContainer {
MyType field1;
MyType field2;
public MyContainer() {
super();
}
public MyContainer(MyType field1, MyType field2) {
super();
this.field1 = field1;
this.field2 = field2;
}
public MyType getField1() {
return field1;
}
public MyType getField2() {
return field2;
}
}
がMyType
public class MyType {
private MyEnum var1;
private String var2;
public MyType() {
super();
}
public MyType(MyEnum var1, String var2) {
this.var1 = var1;
this.var2 = var2;
}
public MyEnum getVar1() {
return var1;
}
public String getVar2() {
return var2;
}
}
MyEnum
public enum MyEnum {
A(""),
N("0");
private final String value;
private MyEnum(String value) {
this.value = value;
}
@Override
public String toString() {
return this.value;
}
}
実行
java.lang.reflect.Field[] allFields = MyContainer.class.getDeclaredFields();
MyType obj = new MyType();
for (java.lang.reflect.Field field : allFields) {
if (MyType.class == field.getType()){
field.setAccessible(true);
MyType myAux = (MyType) field.get(obj);
String dowhatever = myAux.getVar2();
}
}
あなたは例外で見ることができるとおり、test.MyTypeフィールドタイプは、鋳造で提供test.MyTypeと全く同等であると考えられます。私が間違っていることは何ですか?
これをさらに[mcve]に減らす必要があるようです。 (コードをより読みやすくフォーマットすると助けになります。) –