2009-09-29 4 views
3

Я слышал, что есть способ прочитать значение из памяти (до тех пор, пока память управляется JVM). Но как я могу получить байты с адреса 8E5203? Существует метод, называемый getBytes(long). Могу ли я использовать это?sun.misc.Unsafe: Как получить байты с адреса

Большое спасибо! Pete

ответ

2

Вы не можете напрямую получить доступ к имеющейся ячейке памяти! Он должен управляться JVM. Возникает исключение безопасности или EXCEPTION_ACCESS_VIOLATION. Это может привести к сбою самого JVM. Но если мы выделяем память из кода, можно получить доступ к байтам.

public static void main(String[] args) { 
    Unsafe unsafe = null; 

     try { 
      Field field = sun.misc.Unsafe.class.getDeclaredField("theUnsafe"); 
      field.setAccessible(true); 
      unsafe = (sun.misc.Unsafe) field.get(null); 
     } catch (Exception e) { 
      throw new AssertionError(e); 
     } 

     byte size = 1;//allocate 1 byte 
     long allocateMemory = unsafe.allocateMemory(size); 
     //write the bytes 
     unsafe.putByte(allocateMemory, "a".getBytes()[0]); 
     byte readValue = unsafe.getByte(allocateMemory);    
     System.out.println("value : " + new String(new byte[]{ readValue})); 
} 
Смежные вопросы