gpt4 book ai didi

Java - 反射 - 如何调用复制构造函数?

转载 作者:行者123 更新时间:2023-12-01 04:11:20 25 4
gpt4 key购买 nike

我有这个代码:

我要复制的类:

public class NormalChair extends AbstractChair {
protected int height;
protected String name;
public NormalChair() {
super();
}

public NormalChair(String name, int height) {
super(name, height);
}


// Copy constructor - getName() and getHeight() are defined in parent class.
public NormalChair(NormalChair chair) {
this(chair.getName(), chair.getHeight());
}
}

创建一些类

public Object createObj(String cls_name, String param1, int param2){ return Class.forName(cls_name).getConstructor(String.class, Integer.class).newInstance(param1, param2);}

然后我尝试使用以下方法复制该类的对象:

Object obj_to_copy = createObj("Classname", "name", 10);
String cls_name = obj_to_copy.getClass().getName();
Class.forName(cls_name).getConstructor(Object.class).newInstance(obj_to_copy);

我收到此错误:

Exception in thread "main" java.lang.NoSuchMethodException: test.NormalChair.<init>(java.lang.Object)
at java.lang.Class.getConstructor0(Class.java:2800)
at java.lang.Class.getConstructor(Class.java:1708)
at test.ProductTrader.create(ProductTrader.java:57)
at test.Test.main(Test.java:23)

所以我想我需要以某种方式调用复制构造函数,而不是将其类型显示为对象?

附注我给出的这个例子也很简单。但实际上我不知道在运行之前需要复制哪个类,因此使用复制构造函数不应仅依赖于 NormalChair 类。

更新:

我更新了我的问题,以便更清楚地表明,当我在运行时之前复制对象时,我不知道它需要复制什么类。

最佳答案

出于某种原因,Java 反射严格匹配类和方法签名。因此,为了找到匹配的构造函数,您需要使用 Class.getDeclaredConstructors() 枚举可用的构造函数并找到匹配的构造函数。

我编写了一个小库来简化任务,这里是一个与它匹配的类的方法:HavingMethodSignature .

如果您有兴趣,请按以下方式 create a new instance有了这个库:

Object o = OpenBean.newInstance(Class.forName(cls_name));

关于Java - 反射 - 如何调用复制构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19888119/

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