2015-08-17 54 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