2012-03-07 133 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)。问题解决了。