Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.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_Clone_Shallow Clone - Fatal编程技术网

Java 如何克隆未实现可克隆的实例?

Java 如何克隆未实现可克隆的实例?,java,clone,shallow-clone,Java,Clone,Shallow Clone,我的框架处理任何类的域对象。我需要能够浅层克隆这样一个域对象实例foo,就像它实现了Cloneable(它没有实现)一样,并且我在其上调用了object.clone(),这将返回浅层克隆 class A{ private int a; private int[] b; public int getA() { return a; } public void setA(int a) { this.a = a; }

我的框架处理任何类的域对象。我需要能够浅层克隆这样一个域对象实例
foo
,就像它实现了
Cloneable
(它没有实现)一样,并且我在其上调用了
object.clone()
,这将返回浅层克隆

class A{
    private int a;
    private int[] b;


    public int getA() {
        return a;
    }
    public void setA(int a) {
        this.a = a;
    }
    public int[] getB() {
        return b;
    }
    public void setB(int[] b) {
        this.b = b;
    }

    public static A shallowCopyOf(A instanceOfA){ //performs shallow copy
        A newInstance  = new A();
        newInstance.setA(instanceOfA.getA());
        newInstance.setB(instanceOfA.getB());
        return newInstance;
    }
}
不起作用的事情:

  • 强制foo的类实现
    Cloneable
    ,从而实现公共方法
    clone()
  • 通过反射调用foo.clone()。它抛出
    CloneNotSupportedException
    ,因为
    foo
    的类没有实现
    Cloneable
  • 序列化和反序列化foo:我需要一个浅拷贝,而不是一个深拷贝
限制:

  • foo
    的类在编译时是未知的
  • foo
    可能有未作为getter/setter公开的字段
注意:有两个类似的问题,但似乎没有一个集中在获得浅克隆上。

可以克隆不可克隆的bean,只要它们有setter/getter。不幸的是,bean映射器也不支持私有字段的映射

class A{
    private int a;
    private int[] b;


    public int getA() {
        return a;
    }
    public void setA(int a) {
        this.a = a;
    }
    public int[] getB() {
        return b;
    }
    public void setB(int[] b) {
        this.b = b;
    }

    public static A shallowCopyOf(A instanceOfA){ //performs shallow copy
        A newInstance  = new A();
        newInstance.setA(instanceOfA.getA());
        newInstance.setB(instanceOfA.getB());
        return newInstance;
    }
}

最后,您可能更容易基于自己的反射来实现它(正如hoaz所建议的),因为大多数bean映射库都尝试执行深度复制,并且您似乎有一些特殊的要求(例如支持复制私有字段)。

创建复制构造函数,或者使用反射遍历所有字段并将它们复制到新实例1。你不应该这样做;这是不可能的,事实上,如果可能的话,那将是一件坏事。@nos不,澄清了这个问题以反映这一点。TNX与限制不兼容“foo的类在编译时是未知的”一位同事也与我联系