Récupération d'un nom de classe en Java

1. Vue d'ensemble

Dans ce didacticiel, nous allons découvrir quatre façons de récupérer le nom d'une classe à partir de méthodes de l' API de classe : getSimpleName (), getName (), getTypeName () et getCanonicalName ().

Ces méthodes peuvent être déroutantes en raison de leurs noms similaires et de leurs Javadocs quelque peu vagues. Ils ont également quelques nuances en ce qui concerne les types primitifs, les types d'objets, les classes internes ou anonymes et les tableaux.

2. Récupération du nom simple

Commençons par la méthode getSimpleName () .

En Java, il existe deux types de noms: simples et qualifiés . Un nom simple consiste en un identifiant unique tandis qu'un nom qualifié est une séquence de noms simples séparés par des points.

Comme son nom l'indique, getSimpleName () renvoie le nom simple de la classe sous-jacente, c'est-à-dire le nom qui lui a été donné dans le code source .

Imaginons la classe suivante:

package com.baeldung.className; public class RetrieveClassName {}

Son nom simple serait RetrieveClassName :

assertEquals("RetrieveClassName", RetrieveClassName.class.getSimpleName());

Nous pouvons également obtenir des types primitifs et des tableaux de noms simples. Pour les types primitifs qui seront simplement leurs noms, comme int, boolean ou float .

Et pour les tableaux, la méthode retournera le nom simple du type du tableau suivi d'une paire de crochets ouvrants et fermants pour chaque dimension du tableau ([]) :

RetrieveClassName[] names = new RetrieveClassName[]; assertEquals("RetrieveClassName[]", names.getClass().getSimpleName());

Par conséquent, pour un tableau String bidimensionnel , l'appel de getSimpleName () sur sa classe renverra String [] [] .

Enfin, il y a le cas spécifique des classes anonymes. L'appel de getSimpleName () sur une classe anonyme renverra une chaîne vide.

3. Récupération d'autres noms

Il est maintenant temps de voir comment nous obtiendrions le nom d'une classe, le nom du type ou le nom canonique. Contrairement à getSimpleName () , ces noms visent à donner plus d'informations sur la classe.

La méthode getCanonicalName () renvoie toujours le nom canonique tel que défini dans la spécification du langage Java.

Comme pour les autres méthodes, la sortie peut différer un peu selon les cas d'utilisation. Nous verrons ce que cela signifie pour différents types de primitifs et d'objets.

3.1. Types primitifs

Commençons par les types primitifs, car ils sont simples. Pour les types primitifs, les trois méthodes getName (), getTypeName () et getCanonicalName () renverront le même résultat que getSimpleName () :

assertEquals("int", int.class.getName()); assertEquals("int", int.class.getTypeName()); assertEquals("int", int.class.getCanonicalName());

3.2. Types d'objets

Nous allons maintenant voir comment ces méthodes fonctionnent avec les types d'objets. Leur comportement est généralement le même: ils renvoient tous le nom canonique de la classe .

Dans la plupart des cas, il s'agit d'un nom qualifié qui contient tous les noms simples des packages de classe ainsi que le nom simple de la classe:

assertEquals("com.baeldung.className.RetrieveClassName", RetrieveClassName.class.getName()); assertEquals("com.baeldung.className.RetrieveClassName", RetrieveClassName.class.getTypeName()); assertEquals("com.baeldung.className.RetrieveClassName", RetrieveClassName.class.getSimpleName());

3.3. Classes intérieures

Ce que nous avons vu dans la section précédente est le comportement général de ces appels de méthode, mais il y a quelques exceptions.

Les classes intérieures en font partie. Les méthodes getName () et getTypeName () se comportent différemment de la méthode getCanonicalName () pour les classes internes.

getCanonicalName () renvoie toujours le nom canonique de la classe , c'est-à-dire le nom canonique de la classe englobante plus le nom simple de la classe interne séparés par un point.

On the other hand, the getName() and getTypeName() methods return pretty much the same but use a dollar as the separator between the enclosing class canonical name and the inner class simple name.

Let's imagine an inner class InnerClass of our RetrieveClassName:

public class RetrieveClassName { public class InnerClass {} }

Then each call denotes the inner class in a slightly different way:

assertEquals("com.baeldung.RetrieveClassName.InnerClass", RetrieveClassName.InnerClass.class.getCanonicalName()); assertEquals("com.baeldung.RetrieveClassName$InnerClass", RetrieveClassName.InnerClass.class.getName()); assertEquals("com.baeldung.RetrieveClassName$InnerClass", RetrieveClassName.InnerClass.class.getTypeName());

3.4. Anonymous Classes

Anonymous classes are another exception.

As we've already seen they have no simple name, but they also don't have a canonical name. Therefore, getCanonicalName() doesn't return anything. In opposition to getSimpleName(), getCanonicalName() will return nulland not an empty string when called on an anonymous class.

As for getName() and getTypeName() they will return the calling class canonical name followed by a dollar and a number representing the position of the anonymous class among all anonymous classes created in the calling class.

Let's illustrate this with an example. We'll create here two anonymous classes and call getName() on the first and getTypeName() on the second, declaring them in com.baeldung.Main:

assertEquals("com.baeldung.Main$1", new RetrieveClassName() {}.getClass().getName()); assertEquals("com.baeldung.Main$2", new RetrieveClassName() {}.getClass().getTypeName());

We should note that the second call returns a name with an increased number at its end, as it's applied on the second anonymous class.

3.5. Arrays

Finally, let's see how arrays are handled by the above three methods.

To indicate we're dealing with arrays, each method will update its standard result. The getTypeName() and getCanonicalName() methods will append pairs of brackets to their result.

Let's see the following example where we call getTypeName() and getCanonicalName() on a bidimensional InnerClass array:

assertEquals("com.baeldung.RetrieveClassName$InnerClass[][]", RetrieveClassName.InnerClass[][].class.getTypeName()); assertEquals("com.baeldung.RetrieveClassName.InnerClass[][]", RetrieveClassName.InnerClass[][].class.getCanonicalName());

Note how the first call uses a dollar instead of a dot to separate the inner class part from the rest of the name.

Let's now see how the getName() method works. When called on a primitive type array, it will return an opening bracket and a letter representing the primitive type.Let's check that with the following example, calling that method on a bidimensional primitive integers array:

assertEquals("[[I", int[][].class.getName());

D'autre part, lorsqu'il est appelé sur un tableau d'objets, il ajoutera un crochet ouvrant et la lettre L à son résultat standard et se terminera par un point-virgule . Essayons-le sur un tableau de RetrieveClassName :

assertEquals("[Lcom.baeldung.className.RetrieveClassName;", RetrieveClassName[].class.getName());

4. Conclusion

Dans cet article, nous avons examiné quatre méthodes pour accéder à un nom de classe en Java. Ces méthodes sont: getSimpleName (), getName (), getTypeName () et getCanonicalName () .

Nous avons appris que le premier renvoie simplement le nom de code source d'une classe tandis que les autres fournissent plus d'informations telles que le nom du package et une indication du fait que la classe est interne ou anonyme.

Le code de cet article se trouve à l'adresse over sur GitHub.