我对copyMemory有一个不安全的问题。我花了两天时间解决这个问题,但没有结果。下面的代码总是以"IllegalArgumentException“结尾。你能帮我看看哪里有问题吗?
public void testMemoryCopy() {
class A {
public long val = 10;
}
A a0 = new A();
A a1 = new A();
try {
long offset = unsafe.objectFieldOffset(A.class.getField("val"));
unsafe.copyMemory(a0, offset, a1, offset, 8);
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
}
}发布于 2017-03-14 17:00:37
不幸的是,此版本的Unsafe.copyMemory只适用于复制到离堆内存区域(通过提供null作为目标+绝对内存地址而不是偏移)或复制到原始数组时。
当尝试指定除null或primitve数组之外的其他任何东西作为第三个参数时,您将得到一个java.lang.IllegalArgumentException。
或者,您可以使用Unsafe.copyMemory (long srcAddress, long destAddress, long bytes)并直接提供地址(当然,这是危险的,因为在此期间对象可能已经移动)。
https://stackoverflow.com/questions/41051636
复制相似问题