我想了解反射和獲得字段如下:一個類實例化動態
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()方法。這猜測是否正確,如果是這樣,我該如何去做這件事?
請看這個http://stackoverflow.com/questions/364523/is-there-a-general-backend-library-for-java-reflection for Java反射中的幾個好的庫。 – Uberto