[英]Java - reflection - how to call copy constructor?
我有以下代码:
我要复制的课程:
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){返回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)
所以我想我需要以某种方式调用复制构造函数,而不是将其类型显示为Object?
PS 另外,我也以简单的方式给出了此示例。 但是实际上,我不知道在运行时之前需要复制哪个类,因此使用复制构造函数不应仅依赖于NormalChair class.
更新:
我更新了我的问题,以使其更清楚地说明,当我在运行时之前复制对象时,我将不知道需要复制哪个类。
Java反射出于某些原因会严格匹配类和方法签名。 因此,为了找到匹配的构造函数,您需要使用Class.getDeclaredConstructors()
枚举可用的构造函数,然后找到一个匹配的构造函数。
我已经编写了一个小型库来简化任务,这是与之匹配的类的方法: HavenMethodSignature 。
Object o = OpenBean.newInstance(Class.forName(cls_name));
为什么要用Java的拷贝构造函数打扰? 有一种在Java中复制对象的标准方法:只需克隆它即可。 如果默认克隆不相关,请重写clone()方法。
您只需要编写obj.clone()即可获得副本。
有关详细信息,请参见clone()的Java文档 。
如果可以假定复制构造函数接受同一类的对象,则可以执行以下操作:
class ObjectCopier {
public static Object copy(Object orig) {
Class<?> cls = orig.getClass();
Constructor<?> con = cls.getDeclaredConstructor(cls);
return ((con == null) ? null : con.newInstance(orig);
}
}
(未经测试,请这样对待)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.