0

我正在尝试了解反射并获取如下字段:

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() 方法。这个猜测是否正确,如果正确,我该怎么做?

4

2 回答 2

1

主要问题是您试图获取实例TestClass上字段的值。Object这是一个类型错误。TestClass传递to的实例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类/对象的字段。

于 2012-11-18T12:03:04.043 回答
0
    Object o=Class.forName(qualifiedClassName).newInstance();

然后您可以将 o 转换为您的班级,然后调用适当的方法。qualifiedClassName 是类名的字符串表示形式,例如“TestClass”

于 2012-11-18T12:06:38.013 回答