回答
protected native Object clone()
。我不完全知道(我需要看看本地代码),但它会在JVM中创建对象的新实例并复制所有字段。
但是你应该避免使用clone()
- 这是很难得到它的权利。看看this question更多细节
它是如何工作的the Javadoc被布局:
的方法
clone
为Object
类执行特定的克隆操作。首先,如果该对象的类没有实现接口Cloneable
,则引发CloneNotSupportedException
。请注意,所有数组都被视为实现Cloneable接口。否则,此方法创建该对象的类的新实例,并使用该对象的相应字段的内容来初始化其所有字段,就像通过赋值一样;这些字段的内容本身并不克隆。因此,此方法执行此对象的“浅拷贝”,而不是“深拷贝”操作。
例如,一个天真,浅场逐场副本,非常接近(但可能不完全)只是一个位对位对象的副本。
我在寻找本地方法克隆的实施细节。
将从JVM实现到JVM实现不同而不同。不过,如果这是您的担忧,这可能是一个非常有效的操作。
Object.clone()
实现是一个本地方法,它检查对象的类是否实现了Cloneable
,然后简单地分配一个新实例并执行逐个字段的浅拷贝。复制很可能是使用内存拷贝完成的 - 不需要它做更多的花哨。 (但是,如果你真的想知道,看看OpenJDK的源代码。)
在JNI而言,clone
是(或可能)使用AllocObject
方法,而不调用任何构造函数创建一个新的对象来实现的(而不是到NewObject
)。当你有新的对象时,反射被用来浅拷贝所有的字段。
但是再一次,clone
/Clonable
机制在Java中基本上被打破。 Joshua Bloch在Effective Java有关于它的章节。关于它也有几个相关的SO questions。
Joshua Block的链接为+1,但它也被打破,就像克隆功能一样。以下是我们可以直接阅读的内容:http://www.artima.com/intv/bloch13.html –
- 1. SignalR.Redis如何在引擎盖下工作?
- 2. CSS如何在引擎盖下工作?
- 3. Mockito.when如何在引擎盖下工作
- 4. callvirt如何在引擎盖下工作?
- 5. gmail如何在引擎盖下工作
- 6. Gperftools如何在引擎盖下工作?
- 7. Prolog如何在技术上工作?引擎盖下有什么?
- 8. Gradle任务内联配置如何在引擎盖下工作?
- 9. Ruby Book有关如何在引擎盖下工作的建议?
- 10. 科尔多瓦插件如何在引擎盖下工作?
- 11. sql'limit'命令如何在引擎盖下工作?
- 12. LINQ IEnumerable如何在引擎盖下工作?
- 13. Clojure传感器如何在引擎盖下工作?
- 14. 如何合并分支实际工作(在引擎盖下)?
- 15. Sencha,phonegap或corona如何真正在引擎盖下工作?
- 16. linq concat如何在引擎盖下工作?
- 17. PHP5“克隆”如何工作?
- 18. 覆盖克隆方法 - 不工作(Java)
- 19. 银行交易如何“引擎盖下”工作 - 可能详细
- 20. 如何在perforce中克隆工作区
- 21. XNA在引擎盖下?
- 22. Callable如何在引擎盖下工作?可调用对象如何返回值?
- 23. 如何在计算引擎上克隆/复制您的实例?
- 24. 使用safecracker克隆表达式引擎
- 25. 谷歌计算引擎 - 克隆实例
- 26. 克隆下拉工作不正常
- 27. 覆盖无克隆的克隆
- 28. 引擎盖下如何递归处理
- 29. 如何克隆Eclipse工作区
- 30. php克隆不能如何工作
+1为避免使用克隆()':) –
嗯......我正在思考如何执行原生实现的方式。 – vinoth