2009-09-29 6 views
3

J'ai entendu dire qu'il y avait un moyen de lire une valeur de la mémoire (tant que la mémoire est contrôlée par la JVM). Mais comment obtenir les octets de l'adresse 8E5203 par exemple? Il existe une méthode appelée getBytes(long). Puis-je l'utiliser?sun.misc.Unsafe: Comment obtenir les octets d'une adresse

Merci beaucoup! Pete

Répondre

2

Vous ne pouvez pas accéder directement à un emplacement de mémoire! Il doit être géré par la JVM. Une exception de sécurité ou EXCEPTION_ACCESS_VIOLATION se produit. Cela pourrait planter la JVM elle-même. Mais si nous allouons de la mémoire à partir du code, on peut accéder aux octets.

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})); 
} 
Questions connexes