La méthode getClass(), l'objet Class et une introduction à Reflection - 1

« Salut Amigo ! »

"Maintenant, il est temps pour l'événement principal. Nous allons nous familiariser avec la classe Class et aborder la réflexion.
Comme vous l'avez probablement déjà compris, tout en Java est un objet. Et de quoi un objet a-t-il besoin ? Qu'est-ce que chaque objet a qui définit de quoi s'agit-il ?"

"Une classe!"

"Bien ! Bien joué. Chaque objet a une classe. Mais revenons aux objets... Certains objets contiennent entièrement une entité, tandis que d'autres aident simplement à la gérer."

"Ce dernier type inclut FileOutputStream et Thread . Lorsque vous créez un objet Thread , un nouveau thread n'est pas créé. Le thread est créé par la machine virtuelle Java après l'appel de la méthode start(). Cet objet permet simplement de gérer le processus."

"Idem avec FileOutputStream : le fichier est stocké sur disque, et le système d'exploitation gère le stockage et l'accès. Mais nous pouvons interagir avec lui via des objets File, encore une fois avec l'aide de la machine virtuelle Java."

"Oui, j'ai déjà compris ça."

"Donc, il y a une classe spéciale appelée Class pour interagir avec les classes."

"Ce n'était pas difficile à deviner."

"Oui. Chaque fois que la machine virtuelle Java charge une nouvelle classe en mémoire, elle crée un objet Class, que vous pouvez utiliser pour obtenir des informations spécifiques sur la classe chargée."

"Chaque classe et objet est associé à un « Objet de classe »."

Exemple Description
Class clazz = Integer.class;
Obtient l'objet Class de la classe Integer.
Class clazz = int.class;
Obtient l'objet Class de la classe int.
Class clazz = "123".getClass();
Obtient l'objet Class d'un objet String.
Class clazz = new Object().getClass();
Obtient l'objet Class de l'objet Object.

« Wow ! Comme c'est intéressant !

"Vous souvenez-vous que le mot classe est un mot clé en Java et ne peut pas être utilisé comme nom de variable ?"

"Oh ouais, je sais, je sais. J'ai juste oublié."

« Avez-vous déjà utilisé l'objet Class quelque part ?

"Oui, nous l'avons utilisé lorsque nous avons écrit notre propre implémentation de la méthode equals."

"Oui, vous pouvez utiliser la méthode getClass() pour tester si les objets ont la même classe."

« Et que pouvez-vous faire avec cet objet ?

"Eh bien, beaucoup de choses:"

Code Java Description
Class s = int.class;
String name = s.getName();
Obtient le nom de la classe.
Class s = Class.forName("java.lang.String");
Obtient une classe par son nom.
Object o1 = String.valueOf(1);
Object o2 = 123 + "T";
o1.getClass() == o2.getClass();
Compare les classes d'objets.

"Intéressant, mais pas aussi cool que je le pensais."

"Tu veux que ce soit cool ? Il y a aussi ReflectionReflection est super cool."

"C'est quoi Réflexion ?"

" La réflexion est la capacité d'une classe à obtenir des informations sur elle-même. Java a des classes spéciales :  Field et Method , qui sont similaires à la classe Class pour les classes. Tout comme les objets Class vous permettent d'obtenir des informations sur une classe, les objets Field fournissent des informations sur un champ , et l'objet Method fournit des informations sur une méthode. Et regardez ce que vous pouvez en faire :"

Code Java Description
Class[] interfaces = List.class.getInterfaces();
Obtient une liste d'objets Class pour les interfaces de la classe List
Class parent = String.class.getSuperclass();
Obtient l'objet Class de la classe parent de la classe String
Method[] methods = List.class.getMethods();
Obtient une liste des méthodes de la classe List
String s = String.class.newInstance();
Crée une nouvelle chaîne
String s = String.class.newInstance();
Method m = String.class.getMethod("length");
int length = (int) m.invoke(s)
Obtient la méthode de longueur de la classe String et l'appelle sur le String s

« Wow ! Maintenant c'est vraiment cool !