如果我只能访问一个对象的接口并且不能序列化,我可以克隆它吗?



我有一个对象的接口。我不知道实现是否可序列化。也可克隆。我没有对象属性的getter,我也不知道这些属性

我还能克隆对象吗?我的意思是,我能不能这样做:

public void copyMyObject(MyObject myObject){
this.copyOfMyObject = ...//? can I make a deep copy?
}

我猜不是…但也许我错过了什么。

嗯…这取决于.

你可以序列化一个对象,如果对象的实际类实现了Serializable…剩下的1。实际类型可能与您从中获取对象引用的变量的(静态)类型不同。

但如果没有,那么你并没有错过什么。深度复制一个没有实现自己的深度复制方法、getter和setter或某种形式的序列化的对象,将涉及一些极其讨厌的编码2

你最好设计你的类,使它们可以被序列化/克隆。或者,这样你就不需要来克隆它们。

注意,有一些Java类不可能正确地克隆,即使使用"的意思。例子包括ThreadSocketClassClassLoader和一些关键的awt类。因此,如果您的(假设的)应用程序设计依赖于(比如说)能够克隆一个正在运行的线程,那么该设计将无法实现。


1 -非transientnull的实例字段也需要序列化。等等......
2 -例如,你可以利用抽象打破反射,并使用Unsafe来复制对象序列化实现在底层所做的事情…没有Serializable类型检查。但这是个坏主意。