动态实例化一个类

时间:2012-11-18 11:55:05

标签: java reflection

我正在尝试学习反思并获得如下字段:

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

2 个答案:

答案 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”