我有一个对象的接口。我不知道实现是否可序列化。也可克隆。我没有对象属性的getter,我也不知道这些属性
我还能克隆对象吗?我的意思是,我能不能这样做:
public void copyMyObject(MyObject myObject){
this.copyOfMyObject = ...//? can I make a deep copy?
}
我猜不是…但也许我错过了什么。
嗯…这取决于.
你可以序列化一个对象,如果对象的实际类实现了Serializable
…剩下的1。实际类型可能与您从中获取对象引用的变量的(静态)类型不同。
但如果没有,那么你并没有错过什么。深度复制一个没有实现自己的深度复制方法、getter和setter或某种形式的序列化的对象,将涉及一些极其讨厌的编码2。
你最好设计你的类,使它们可以被序列化/克隆。或者,这样你就不需要来克隆它们。
注意,有一些Java类不可能正确地克隆,即使使用"的意思。例子包括Thread
、Socket
、Class
、ClassLoader
和一些关键的awt
类。因此,如果您的(假设的)应用程序设计依赖于(比如说)能够克隆一个正在运行的线程,那么该设计将无法实现。
1 -非transient
和null
的实例字段也需要序列化。等等......
2 -例如,你可以利用抽象打破反射,并使用Unsafe
来复制对象序列化实现在底层所做的事情…没有Serializable
类型检查。但这是个坏主意。