我正在尝试学习反思并获得如下字段:
Class<?> inputClass = in.getClass();
Field[] classFields = inputClass.getFields();
到目前为止,代码还不错。现在我想浏览每个字段,打印它们的值,所以我这样做:
for (Field f : classFields) {
System.out.println(f.get(new Object()).toString());
}
使用适当的try / catch进行IllegalAccessException(为清楚起见,省略)。我也试过在这里传递一个字符串,这也产生了下面描述的结果。每个f的类型都不是Object,String或等于in的类型。
抛出异常:
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)
我猜这是因为我传递了一个Object(或String,当我用String替换Object)的实例,而不是该类实际包含的Object的特定子类的实例。由于我不知道在编译时这将是什么,我需要从字段中提取有关类的类型的信息,并在运行时将其实例化以传递给get()方法。这个猜测是否正确,如果是这样,我该怎么做呢?
答案 0 :(得分:1)
主要问题是您尝试在TestClass
实例上获取Object
字段的值。这是一个类型错误。将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
个字段。
答案 1 :(得分:0)
Object o=Class.forName(qualifiedClassName).newInstance();
然后你可以把o投射到你的班级,然后调用适当的方法。 qualifiedClassName是类名的String表示形式,如“TestClass”