2012-03-07 75 views
0

我正在構建一個框架,我需要在運行時創建對象的副本,我不想強​​制這些對象類實現任何接口,如Cloneable或Prototype模式,或其他任何東西。有效克隆未知的對象不支持克隆

因此,爲此,我計劃使用sun.misc.Unsafe及其方法allocateInstance(Class cls)copyMemory(Object srcBase, long srcOffset, Object destBase, long destOffset, long bytes)的功能有效地克隆這些對象。但我無法找到任何方式在堆空間中獲取字節大小的對象。

我知道我可以使用反射和從字段複製到字段。但這並非沒有效率。 你知道在堆中獲取對象大小的任何方式嗎?或者其他有效複製對象的方式?

+4

您不能複製任意對象。這樣做可能是危險的。你想做什麼? – SLaks 2012-03-07 17:11:19

+0

你可能會傷害自己! – Zaki 2012-03-07 17:18:47

+0

我想在運行時複製一個對象,並且在編譯時我沒有任何有關該對象的信息。我不能強迫它實現任何接口,也不能提供任何工廠或其他任何東西。 – 2012-03-07 18:00:24

回答

3

做到這一點的正確方法是真的,誠實地說,使用對象自己的方法,構造函數和工廠來進行復制。 clone被嚴重破壞而沒有像這樣濫用它。

+0

克隆有沒有被濫用...... O :-) – mcfinnigan 2012-03-07 17:19:39

+0

如果你真的想要虐待,採取一個無辜的類,子類實現'克隆'。 > :) – 2012-03-07 17:32:50

+0

也許我沒有解釋清楚,但我正在談論一個「未知對象」。某些對象,在編譯時您沒有任何信息,也不能強制實現任何特定的接口。 – 2012-03-07 17:55:49

0

一旦我使用ASM字節碼儀器儀表工具,那麼我就可以得到一個物體的大小槽從類java.lang.instrument.Instrumentation方法getObjectSize(Object objectToSize)。問題解決了。