2016-07-06 9 views
0

このフィールドのメソッドを実行するために、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と全く同等であると考えられます。私が間違っていることは何ですか?

+0

これをさらに[mcve]に減らす必要があるようです。 (コードをより読みやすくフォーマットすると助けになります。) –

答えて

1

objが

java.lang.reflect.Field[] allFields = MyContainer.class.getDeclaredFields();   
MyContainer obj = new MyContainer(); 

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();  

    } 
} 

をMYTYPE、クラスMyContainerのではないでなければなりませんhere

get(Object obj) 

は、指定されたオブジェクトについて、このFieldによって表されるフィールドの値を返します参照してください。

+0

クイック&簡単。ありがとうございました! – crm86

+0

@ crm86私の答えも受け入れてください。ありがとうございました! – Apostolos