gpt4 book ai didi

java - 动态实例化类

转载 作者:行者123 更新时间:2023-12-01 15:02:30 27 4
gpt4 key购买 nike

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

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

最佳答案

主要问题是您试图获取 Object 实例上的 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 字段。

关于java - 动态实例化类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13439862/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com