Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-反射-如何调用复制构造函数?_Java_Reflection_Copy Constructor - Fatal编程技术网

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

Java-反射-如何调用复制构造函数?,java,reflection,copy-constructor,Java,Reflection,Copy Constructor,我有以下代码: 我要复制的类: 创建一些类 公共对象createObjString cls_名称,字符串param1,int param2{ 返回Class.forNamecls_name.getConstructorString.Class,Integer.Class.newInstanceparam1,param2; } 然后我尝试使用以下方法复制该类的对象: Object obj_to_copy = createObj("Classname", "name", 10); String cl

我有以下代码:

我要复制的类:

创建一些类

公共对象createObjString cls_名称,字符串param1,int param2{ 返回Class.forNamecls_name.getConstructorString.Class,Integer.Class.newInstanceparam1,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)
所以我想我需要以某种方式调用复制构造函数,而不是将其类型显示为对象

另外,我举的这个例子过于简单。但实际上,我不知道在运行之前需要复制哪个类,所以使用复制构造函数不应该只依赖于类

更新:


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

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

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

如果您感兴趣,以下是如何使用此库:

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

为什么要在Java中使用复制构造函数呢?在Java中复制对象有一种标准方法:只需克隆它。如果默认克隆不相关,请重写克隆方法

只需编写obj.clone即可获得副本


有关详细信息,请参阅。

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

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

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

未经测试,所以将其视为

可能是Class.forNamecls\u name.getConstructor或normalchair.Class?可能我没有解释清楚。我给出了一个简单的例子,但实际上我不知道我需要复制哪个类,所以在构造函数中,我需要使用一些可以根据我需要复制的类而改变的东西。有人发布了有效的答案,但他出于某种原因删除了它。。。对我有效的方法是在getConstructor中使用objc_to_copy.getClass。@Andrius,如果要复制的对象是nc,那么nc.getClass将提供NormalChair类这不是你问题的答案,但我可以看到另一个问题。AbstractChair类显然有height和name字段,但NormalChair声明了重复的字段,受int height保护;受保护的字符串名称;用相同的名字。虽然它们有相同的名称,但它们在其他方面并不相关,而且它们可能有不同的值,从而导致混淆和错误。您应该删除NormalChair类上的“高度”和“名称”字段。它会进行深度复制吗?@Andrius默认情况下不会。如果需要深度复制,则需要重写克隆方法。最有趣的是,类层次结构的某些部分可能需要深度克隆,而其他部分则不需要。因此,您只需要在需要深度克隆时进行覆盖。但克隆本身存在漏洞,因为它不是公共的。除非您有一个通过更具体的类或接口的引用,该类或接口重写了要公开的方法,否则您不能调用它。@Boann我不同意,这不是一个bug,而是一个特性。这是一个设计原则,不允许克隆任何东西,因为它可能有巨大的影响。您可以通过公开克隆的含义来启用克隆。@sebtic启用克隆是可克隆接口的作用,但这也不会公开方法。因此,给定一个可克隆实例,您无法克隆它。
class ObjectCopier {
    public static Object copy(Object orig) {
        Class<?> cls = orig.getClass();
        Constructor<?> con = cls.getDeclaredConstructor(cls);

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