2015-08-17 51 views
0

我有一個將被傳遞給函數的一類,它會被定義如下:檢索類型的類的領域

class ayy{ 

String blah; 
Class a; 
Class b; 

} 

我希望能夠調用getSimpleName()方法的a和b類。目前我這樣做如下:

Class c = (Class)argument; // Where argument is the "ayy" class 
c.getField("a").getSimpleName(); 

但這給了我一個錯誤,說「getSimpleName()」沒有定義類型字段。

回答

2

您不能直接在反射導致的對象上調用方法,例如您正在使用Field,就好像它是所需類型的引用變量。您需要致電getDeclaredField,因爲getField only gets public fields。此外,您需要get() the value of the Field,傳入ayy類的實例,該實例將返回Field的值。那麼你需要將它投射到Class,因爲get()返回Object。那麼你可以撥打getSimpleName()

Class<?> classOfA = (Class<?>) c.getDeclaredField("a").get(anAyy); 
String simpleName = classOfA.getSimpleName(); 

您還需要捕獲可能引發的各種與反射相關的異常。

+0

我可以在classOfA上正常調用方法嗎?比如classOfA.getFields()? – bawse

+0

是的,一旦你有'classOfA',你可以繼續反射並調用任何'Class'方法,例如'getFields'。 – rgettman

+0

我收到一個錯誤:'java.lang.IllegalArgumentException:無法設置java.lang.Class字段MergerArgument.a到java.lang.Class' MergerArgument只是另一個有3個字段的類(其中2個字段是類的Class) – bawse