Java 动态实例化类

Java 动态实例化类,java,reflection,Java,Reflection,我试图了解反射,并获得如下字段: Class<?> inputClass = in.getClass(); Field[] classFields = inputClass.getFields(); 对于IllegalAccessException(为清楚起见省略),使用适当的try/catch。我还尝试在这里传入一个字符串,这也会产生下面描述的结果。每个f都有一个类型,该类型不是Object、String或等于in的类型 这会引发异常: Exception in thread

我试图了解反射,并获得如下字段:

Class<?> inputClass = in.getClass(); 
Field[] classFields = inputClass.getFields();
对于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()方法。这个猜测正确吗?如果正确,我该怎么做呢?

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

    Object o=Class.forName(qualifiedClassName).newInstance();
然后您可以将o强制转换为类,然后调用适当的方法。
qualifiedClassName是类名的字符串表示形式,如“TestClass”

看看这几个关于Java反射的好库。但是由于我不知道在编译时MyClass是什么,我该怎么做?从字段中提取类并在运行时实例化它的Java语法是什么?您在中有实例
,因此将其传递给
get
。所有字段f都有不同的类型,它们不等于in的类型,所以这里是否仍然存在类型错误?Froskoy,您正在获取字段,而不是设置它。如果您正在设置它,您仍然需要在
中添加另一个参数,即要设置的值。在上面的代码中,inputClass是从服务器下载的,它不等于TestClass的类型。inputClass的类型在编译时未知,因此中的行final对象=new TestClass();这是不可能的。你怎么避开这个?您提供的所有示例都是针对本地定义的TestClass版本的。
    Object o=Class.forName(qualifiedClassName).newInstance();