1

我有这个代码:

我要复制的课程:

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)

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

PS我也把这个例子简单化了。但实际上我不知道在运行前需要复制哪个类,所以使用复制构造函数不应该只依赖于NormalChair class.

更新:

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

4

3 回答 3

0

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

我写了一个小库来简化任务,这里有一个匹配类的方法:HavingMethodSignature

如果您有兴趣,以下是使用此库创建新实例的方法:

Object o = OpenBean.newInstance(Class.forName(cls_name));
于 2013-11-10T09:40:12.433 回答
0

为什么要在 Java 中使用复制构造函数?在 Java 中有一种复制对象的标准方法:简单地克隆它。如果默认克隆不相关,请覆盖 clone() 方法。

您只需编写 obj.clone() 即可获得副本。

有关详细信息,请参阅clone() 的 Java 文档

于 2013-11-10T09:47:51.690 回答
0

如果您可以假设复制构造函数接受同一类的对象,则可以执行以下操作:

class ObjectCopier {
    public static Object copy(Object orig) {
        Class<?> cls = orig.getClass();
        Constructor<?> con = cls.getDeclaredConstructor(cls);

        return ((con == null) ? null : con.newInstance(orig);
    }
}

(未经测试,所以这样对待它)

于 2014-03-31T13:12:58.877 回答