2016-07-06 92 views
0

我正在嘗試使用Java反射來獲取通用字段屬性的實例,以便執行此字段的方法。例如,如果我使用方法getValue()有一個MyType類,並且我有另一個具有MyType類屬性的MyContainer類,我在尋找的是動態獲取此Field並執行getValue()方法。這可能嗎?Java反射'無法設置'錯誤

用下面的代碼結構,我得到:

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

物鏡應該類myContainer中的,不MYTYPE

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

    } 
} 

參見here

get(Object obj) 

返回該字段所表示的字段的值,指定的對象上。

+0

快速且簡單。謝謝! – crm86

+0

@ crm86請接受我的回答。謝謝! – Apostolos