我正在尝试了解反射并获取如下字段:
Class<?> inputClass = in.getClass();
Field[] classFields = inputClass.getFields();
到目前为止,代码都很好。现在我想遍历每个字段,打印它们的值,所以我这样做:
for (Field f : classFields) {
System.out.println(f.get(new Object()).toString());
}
为 IllegalAccessException 使用适当的 try/catch(为清楚起见省略)。我也试过在这里传入一个字符串,这也会产生下面描述的结果。每个 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() 方法。这个猜测是否正确,如果正确,我该怎么做?