3

我完全意识到我正在做的是:
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*/ 

任何人都可以看到这段代码有什么问题吗?

4

1 回答 1

2

作为data一个字段,它要么是原始的,要么是引用,在任何一种情况下,您都不能将它复制到某个地方并将其视为byte[]

If datais a byte[] 您需要将其视为真正的对象,而不是事件。

于 2012-09-06T14:46:58.260 回答