Dans la programmation Java traditionnelle, vous n'aurez plus besoin de gérer les objets ou emplacements Java de la mémoire. Lorsque vous en discutez sur les forums, la première question qui se pose est pourquoi avez-vous besoin de connaître l'adresse d'un objet Java ? C'est une question valable. Mais dans le passé, nous nous réservions le droit de procéder à des essais. Il n’y a rien de mal à explorer des questions en territoire inexploré. J'ai proposé une expérience en utilisant les packages de la société Sun. Unsafe est un package appartenant à sun.misc. Peut-être que ce package vous est un peu inconnu, jetez un œil au code source et aux méthodes, et vous saurez à quoi je fais référence.
La gestion de la sécurité de Java offre suffisamment de masquage pour garantir que vous ne puissiez pas manipuler la mémoire aussi facilement. Dans un premier temps, j'ai pensé à obtenir l'emplacement mémoire d'un objet Java. Jusqu'à l'exploration, j'étais sûr à 100% qu'il était impossible de trouver l'emplacement de l'adresse d'un objet en Java.
La documentation de l'API Unsafe.java de Sun montre que nous avons accès à l'adresse en utilisant la méthode objectFieldOffset. Cette méthode semble dire : « La classe dans le rapport alloue son emplacement dans une zone de stockage spécifique. » Elle dit également : « Il s'agit simplement d'un accesseur dans lequel le cookie est transmis à une mémoire tas non sécurisée. Quoi qu'il en soit, je suis capable d'allouer l'emplacement mémoire où un objet est stocké à partir du stockage de sa classe. On pourrait affirmer que ce que nous obtenons n’est pas l’adresse mémoire physique absolue d’un objet. Cependant, nous avons obtenu l’adresse mémoire logique. Le programme suivant vous intéressera beaucoup !
Dans un premier temps, je dois récupérer un objet de la classe Unsafe. C'est difficile car les constructeurs sont privés. Il existe une méthode appelée getUnsafe qui renvoie un objet non sécurisé. La gestion de la sécurité Java nécessite que vous accordiez des privilèges sur le code source. J'ai utilisé un peu de réflexion et j'ai obtenu une instance. Je sais qu'il existe de meilleures façons d'obtenir une instance, mais j'ai choisi la méthode suivante pour contourner la gestion de la sécurité.
Pour utiliser des objets Unsafe, appelez simplement objectFieldOffset et staticFieldOffset. Le résultat est l’adresse d’allocation mémoire de la classe.
L'exemple de programme suivant peut s'exécuter sur JDK1.6.
classe publique ObjectLocation {
pomme int statique privée = 10 ;
privé int orange = 10 ;
public static void main (String[] args) lève une exception {
Unsafe unsafe = getUnsafeInstance();
Champ appleField = ObjectLocation.class.getDeclaredField("apple");
System.out.println("Emplacement d'Apple : "
+ unsafe.staticFieldOffset(appleField));
Champ orangeField = ObjectLocation.class.getDeclaredField("orange");
System.out.println("Emplacement d'Orange : "
+ unsafe.objectFieldOffset(orangeField));
}
private static Unsafe getUnsafeInstance() lève SecurityException,
NoSuchFieldException, IllegalArgumentException,
Exception d'accès illégal {
Champ theUnsafeInstance = Unsafe.class.getDeclaredField("theUnsafe");
theUnsafeInstance.setAccessible(true);
return (Unsafe) theUnsafeInstance.get(Unsafe.class);
}
}