我完全意识到我正在做的是:
1)不安全,我没有更多的保证,类型安全,JVM
因此可能会崩溃
2)我可以使用 ByteBuffers 进行类似的操作或JNI
3)Unsafe 是一个内部类,并且很可能会消失。
我这样做只是为了实验目的,并且知道后果。
考虑到这一点,我尝试使用 Unsafe 和反射从数组中提取数据:
我首先找到数组的字段偏移量:
public long findFieldOffset(Event event) {
try {
Class cl = event.getClass();
Field data_field = cl.getDeclaredField("data");
data_field.setAccessible(true);
long offset = unsafe.objectFieldOffset(data_field);
return offset;
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
return 0;
}
我还提取了数组的基本位置:
int base = unsafe.arrayBaseOffset(byte[].class);
我随后尝试从 Event 类中提取数组,并将其复制到缓冲区(byte_offset
是 的结果findFieldOffset
)。
在下面的代码中,第一部分只是一个测试函数并打印出正确的字符串,而第二部分提取应该是数组的内容,但是在测试时返回垃圾 unicode 值:
/* Testing */
active_buffer.getBuffer().position(1);
active_buffer.getBuffer().put(event.getData());
active_buffer.getBuffer().position(1);
active_buffer.getBuffer().get(tuple, 0, (int)tuple_size);
System.out.println("Test1: " + new String(tuple)) ;
/* Test1 prints out the correct string */
unsafe.copyMemory( (Object) event, byte_offset + base, (Object) null, active_buffer.getAddress() + 1, tuple_size);
active_buffer.getBuffer().position(1);
active_buffer.getBuffer().get(tuple, 0, (int)tuple_size);
System.out.println("Test2: " + new String(tuple));
/* Garbage unicode values gets printed*/
任何人都可以看到这段代码有什么问题吗?