Nous avons déjà parlé du fait que les classes sont des types de données complexes. Parlons maintenant un peu de l'autre côté des classes — comment les classes sont gérées par la machine Java. Rappelez-vous qu'en Java tout est un objet, même une classe. Une classe est un objet. Cela vous surprend-il ? Alors continuons.

Charger une classe en mémoire

En fait, lorsqu'une classe est chargée en mémoire, trois "objets" spéciaux sont créés :

Charger une classe en mémoire

Brève description de l'illustration :

Rectangle jaune :

Le fichier de code est stocké sur le disque sous la forme d'un fichier avec l'extension ".class". Il contient des informations sur la classe, ses champs et ses méthodes, ainsi que le code source des méthodes compilées en bytecode.

Rectangle orange :

Lorsque la machine Java charge une classe en mémoire, elle compile le bytecode en code machine spécifique au processeur et au système d'exploitation de l'ordinateur. Seule la machine Java a accès à ce code machine. En tant que programmeurs Java, nous n'y avons pas accès.

Rectangle vert :

La machine Java crée un objet qui contient toutes les variables statiques et méthodes de la classe. Vous accédez à cet "objet" en utilisant le nom de la classe.

Par exemple, lorsque vous écrivez , vous faites référence à la variable statique située dans la classe. Cet objet est notre rectangle vert. Et c'est là que la variable statique est stockée.java.lang.Math.PIPIjava.lang.Mathjava.lang.MathPI

Rectangle bleu :

Lorsque la machine Java charge le code d'une classe en mémoire, elle crée un objet spécial java.lang.Class, qui stocke des informations sur la classe chargée : son nom, les noms des méthodes, les noms et types des champs, etc.

Le nom "Classe" peut être un peu déroutant. Il serait plus logique de l'appeler ClassInfo, car cette classe ne stocke que des informations sur la classe chargée.

Vous pouvez obtenir l'objet Class pour n'importe quel type à l'aide d'une commande comme celle-ci :

Class name = ClassName.class;

Exemples:

Code Note
Class a = String.class;
Obtenir un Classobjet avec des informations sur la Stringclasse
Class b = Object.class;
Obtenir un Classobjet avec des informations sur la Objectclasse
Class c = Integer.class;
Obtenir un Classobjet avec des informations sur la Integerclasse
Class d = int.class;
Obtenir un Classobjet avec des informations sur le inttype
Class e = void.class;
Obtenir un Classobjet avec des informations sur le voidtype

Vous pouvez également obtenir une référence à un objet de description de classe à partir de n'importe quel objet, puisque chaque objet a la getClass()méthode, dont il hérite de la Objectclasse.

Exemples:

Code Note
Class a = "Hello".getClass();
Même objet queString.class
Class b = new Integer().getClass();
Même objet queInteger.class
Class c = Boolean.TRUE.getClass();
Même objet queBoolean.class