我想了解反射和获得字段如下:一个类实例化动态
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