Abrufen eines Klassennamens in Java

1. Übersicht

In diesem Lernprogramm erfahren Sie vier Möglichkeiten, wie Sie den Namen einer Klasse aus Methoden in der Klassen- API abrufen können : getSimpleName (), getName (), getTypeName () und getCanonicalName ().

Diese Methoden können aufgrund ihrer ähnlichen Namen und ihrer etwas vagen Javadocs verwirrend sein. Sie haben auch einige Nuancen, wenn es um primitive Typen, Objekttypen, innere oder anonyme Klassen und Arrays geht.

2. Einfachen Namen abrufen

Beginnen wir mit der Methode getSimpleName () .

In Java gibt es zwei Arten von Namen: einfache und qualifizierte . Ein einfacher Name besteht aus einer eindeutigen Kennung, während ein qualifizierter Name eine Folge einfacher Namen ist, die durch Punkte getrennt sind.

Wie der Name schon sagt, gibt getSimpleName () den einfachen Namen der zugrunde liegenden Klasse zurück , dh den Namen, den sie im Quellcode angegeben hat .

Stellen wir uns folgende Klasse vor:

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

Sein einfacher Name wäre RetrieveClassName :

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

Wir können auch primitive Typen und Arrays mit einfachen Namen erhalten. Für primitive Typen, die einfach ihre Namen sind, wie int, boolean oder float .

Bei Arrays gibt die Methode den einfachen Namen des Array-Typs zurück, gefolgt von einem Paar, das Klammern für jede Dimension des Arrays öffnet und schließt ([]) :

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

Folglich gibt für ein zweidimensionales String- Array der Aufruf von getSimpleName () für seine Klasse String [] [] zurück .

Schließlich gibt es den speziellen Fall anonymer Klassen. Wenn Sie getSimpleName () für eine anonyme Klasse aufrufen, wird eine leere Zeichenfolge zurückgegeben.

3. Andere Namen abrufen

Jetzt ist es Zeit, einen Blick darauf zu werfen, wie wir den Namen einer Klasse, den Typnamen oder den kanonischen Namen erhalten würden. Im Gegensatz zu getSimpleName () sollen diese Namen mehr Informationen über die Klasse liefern.

Die Methode getCanonicalName () gibt immer den kanonischen Namen zurück, wie er in der Java-Sprachspezifikation definiert ist.

Wie bei den anderen Methoden kann sich die Ausgabe je nach Anwendungsfall geringfügig unterscheiden. Wir werden sehen, was das für verschiedene Grund- und Objekttypen bedeutet.

3.1. Primitive Typen

Beginnen wir mit primitiven Typen, da diese einfach sind. Bei primitiven Typen geben alle drei Methoden getName (), getTypeName () und getCanonicalName () dasselbe Ergebnis wie getSimpleName () zurück :

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

3.2. Objekttypen

Wir werden nun sehen, wie diese Methoden mit Objekttypen funktionieren. Ihr Verhalten ist im Allgemeinen dasselbe: Sie alle geben den kanonischen Namen der Klasse zurück .

In den meisten Fällen ist dies ein qualifizierter Name, der alle einfachen Namen der Klassenpakete sowie den einfachen Namen der Klasse enthält:

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. Innere Klassen

Was wir im vorherigen Abschnitt gesehen haben, ist das allgemeine Verhalten dieser Methodenaufrufe, aber es gibt einige Ausnahmen.

Innere Klassen sind eine davon. Die Methoden getName () und getTypeName () verhalten sich anders als die Methoden getCanonicalName () für innere Klassen.

getCanonicalName () gibt weiterhin den kanonischen Namen der Klasse zurück , dh den kanonischen Namen der einschließenden Klasse sowie den einfachen Namen der inneren Klasse, der durch einen Punkt getrennt ist.

Auf der anderen Seite geben die Methoden getName () und getTypeName () ziemlich gleich zurück, verwenden jedoch einen Dollar als Trennzeichen zwischen dem kanonischen Namen der einschließenden Klasse und dem einfachen Namen der inneren Klasse .

Stellen wir uns eine innere Klasse InnerClass unseres RetrieveClassName vor :

public class RetrieveClassName { public class InnerClass {} }

Dann bezeichnet jeder Aufruf die innere Klasse auf etwas andere Weise:

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. Anonyme Klassen

Anonyme Klassen sind eine weitere Ausnahme.

Wie wir bereits gesehen haben, haben sie keinen einfachen Namen, aber auch keinen kanonischen Namen . Daher gibt getCanonicalName () nichts zurück. Im Gegensatz zu getSimpleName () , getCanonicalName () wird wieder null und nicht eine leere Zeichenfolge , wenn sie auf einer anonymen Klasse.

Wie für getName () und getTypeName () wird sie die Rückkehr Aufruf Klasse Canonical die Position der anonymen Klasse unter allen anonymen Klassen von einem US - Dollar und eine Nummer Namen in der Aufruf - Klasse erstellt darstellt .

Lassen Sie uns dies anhand eines Beispiels veranschaulichen. Wir werden hier zwei anonyme Klassen erstellen und getName () in der ersten und getTypeName () in der zweiten aufrufen und sie in com.baeldung.Main deklarieren :

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

Wir sollten beachten, dass der zweite Aufruf einen Namen mit einer erhöhten Nummer am Ende zurückgibt, da er auf die zweite anonyme Klasse angewendet wird.

3.5. Arrays

Lassen Sie uns abschließend sehen, wie Arrays mit den oben genannten drei Methoden behandelt werden.

Um anzuzeigen, dass es sich um Arrays handelt, aktualisiert jede Methode ihr Standardergebnis. Die Methoden getTypeName () und getCanonicalName () hängen Klammerpaare an ihr Ergebnis an.

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());

Wenn Sie dagegen ein Objektarray aufrufen, werden dem Standardergebnis eine öffnende Klammer und der Buchstabe L hinzugefügt und mit einem Semikolon abgeschlossen . Versuchen wir es mit einem Array von RetrieveClassName :

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

4. Fazit

In diesem Artikel haben wir uns vier Methoden angesehen, um auf einen Klassennamen in Java zuzugreifen. Diese Methoden sind: getSimpleName (), getName (), getTypeName () und getCanonicalName () .

Wir haben erfahren, dass der erste nur den Quellcode-Namen einer Klasse zurückgibt, während die anderen mehr Informationen wie den Paketnamen und einen Hinweis darauf liefern, ob die Klasse eine innere oder eine anonyme Klasse ist.

Der Code dieses Artikels ist auf GitHub zu finden.