我已经四处搜索,并看到了一些提示,但仍无法找到我手头的问题的解决方案:我需要忠实地复制现有的java对象,而不是创建对现有java对象的引用。我没有对类的访问权限,它通过其父类实现克隆方法,实际创建了一个引用。我尝试使用“序列化/反序列化”路由,它在某种程度上起作用,但副本与原始副本不完全相同。 这可以完成吗? 提前谢谢!
大卫
答案 0 :(得分:2)
在一般情况下,你不应该而且你不能。
为什么你不应该:
有些对象不应该被克隆 - 特别是。那些引用软件控制之外的资源的人 - 复制它们可能会导致混乱。
为什么你不能:
序列化和反序列化仅在被克隆对象引用的所有对象都可序列化时才有效。
您可以通过实例化新对象并递归深度克隆所有字段来编写一些使用反射来进行深度克隆的代码,但是,尝试实现一种可以深度克隆此对象的方法:
public class Evil {
public Evil() {
throw new RuntimeException();
}
}
问题的关键在于,如果我没有弄错的话,通过反射克隆总是依赖于通过Reflection调用构造函数,并且构造函数不能保证工作。
但是,在大多数情况下,此方法将克隆大多数对象。但是你仍然不应该这样做!我无法想到这样做的有效方案。
编辑:另外,正如一些评论者所指出的那样,“忠实的副本”是非常不明确的。
编辑2:结论:只有一个类可以知道它是否应该是可克隆的以及如何进行。
答案 1 :(得分:1)
Cloner cloner = new Cloner();
cloner.deepClone(object);