2012-11-18 163 views
0

我想了解反射和獲得字段如下:一個類實例化動態

Class<?> inputClass = in.getClass(); 
Field[] classFields = inputClass.getFields(); 

的代碼是罰款了這一點。現在我想通過每個字段,打印自己的價值,所以我做的:

for (Field f : classFields) { 
    System.out.println(f.get(new Object()).toString()); 
} 

用適當的try/catch一個IllegalAccessException(省略清晰)。我也嘗試過在這裏傳遞一個字符串,這也產生了下面描述的結果。每個f的一個類型,沒有對象,String或等於在

這引發異常:

Exception in thread "Thread-0" java.lang.IllegalArgumentException: Can not set java.lang.String field TestClass.testField to java.lang.Object 
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:164) 
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:168) 
at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:55) 
at sun.reflect.UnsafeObjectFieldAccessorImpl.get(UnsafeObjectFieldAccessorImpl.java:36) 
at java.lang.reflect.Field.get(Field.java:372) 
at LearningReflection.messageToText(LearningReflection.java:88) 
at LearningReflection$1.run(LearningReflection.java:180) 

我猜這是因爲我已經通過對象的實例(或String,當我用String替換Object時),而不是該類實際包含的Object的特定子類的實例。由於我不知道在編譯時會發生什麼,因此我需要從字段中提取有關類的類型的信息,並在運行時將其實例化以傳遞給get()方法。這猜測是否正確,如果是這樣,我該如何去做這件事?

+0

請看這個http://stackoverflow.com/questions/364523/is-there-a-general-backend-library-for-java-reflection for Java反射中的幾個好的庫。 – Uberto

回答

1

主要問題是您試圖在Object實例上獲取TestClass字段的值。這是一個類型錯誤。將TestClass的實例傳遞給get

class TestClass { 
    public Date d = new Date(); 

    public static void main(String[] args) throws Exception { 
    MainClass.printFieldValues(new TestClass()); 
    } 
} 

public class MainClass { 
    public static void printFieldValues(Object in) throws Exception { 
    for (Field f : in.getClass().getFields()) 
     System.out.println(f.getName() + ": " + f.get(in)); 
    } 
} 

請注意,它只訪問類/對象的public字段。

+0

但是由於我不知道MyClass在編譯時是什麼,我該怎麼做?什麼是Java語法,用於從字段中提取類,並在運行時實例化它? – Froskoy

+0

你有'in'實例,所以傳給'get'。 –

+0

所有字段f都有不同的類型,它們*不等於in的類型,所以在這裏還沒有類型錯誤? – Froskoy

0
Object o=Class.forName(qualifiedClassName).newInstance(); 

然後你可以將o轉換爲你的類,然後調用適當的方法。 qualifiedClassName是類名稱的字符串表示形式,如「TestClass」