Klassennamen in Java abrufen

Abrufen eines Klassennamens in Java

1. Überblick

In diesem Lernprogramm lernen Sie vier Möglichkeiten kennen, wie Sie den Namen einer Klasse aus Methoden in derClass-API abrufen können:getSimpleName(), getName(), getTypeName() undgetCanonicalName()

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 dergetSimpleName()-Methode.

In Java gibt es zwei Arten von Namen:simple undqualified. A simple name consists of a unique identifier while a qualified name is a sequence of simple names separated by dots.

Wie der Name schon sagt, gibtgetSimpleName() den einfachen Namen der zugrunde liegenden Klasse zurück, dhthe name it has been given in the source code.

Stellen wir uns folgende Klasse vor:

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

Sein einfacher Name wäreRetrieveClassName:

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

Wir können auch einfache Namen von primitiven Typen und Arrays erhalten. Für primitive Typen, die einfach ihre Namen sind, wieint, boolean oderfloat.

Und für Arrays gibt die Methodethe simple name of the type of the array followed by a pair opening and closing brackets for each dimension of the array ([]) zurück:

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

Folglich gibt der Aufruf vongetSimpleName() für seine Klasse für ein zweidimensionalesString-ArrayString[][] zurück.

Schließlich gibt es den speziellen Fall anonymer Klassen. Calling getSimpleName() on an anonymous class will return an empty string.

3. Abrufen anderer Namen

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

Die MethodegetCanonicalName() gibt immer den kanonischen Namenas defined in the Java Language Specification. zurück

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

3.1. Primitive Typen

Beginnen wir mit primitiven Typen, da diese einfach sind. For primitive types, all three methods getName(), getTypeName() and getCanonicalName() will return the same result as getSimpleName():

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:they all return the canonical name of the class.

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.example.className.RetrieveClassName", RetrieveClassName.class.getName());
assertEquals("com.example.className.RetrieveClassName", RetrieveClassName.class.getTypeName());
assertEquals("com.example.className.RetrieveClassName", RetrieveClassName.class.getSimpleName());

3.3. Innere Klassen

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

Innere Klassen sind eine davon. Die MethodengetName() andgetTypeName()verhalten sich anders als die MethodegetCanonicalName() für innere Klassen.

getCanonicalName() still returns the canonical name of the class, das ist der kanonische Name der umschließenden Klasse plus der einfache Name der inneren Klasse, der durch einen Punkt getrennt ist.

Andererseits geben die MethodengetName() andgetTypeName()ziemlich gleich zurück, aberuse a dollar as the separator between the enclosing class canonical name and the inner class simple name.

Stellen wir uns eine innere KlasseInnerClass unsererRetrieveClassName vor:

public class RetrieveClassName {
    public class InnerClass {}
}

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

assertEquals("com.example.RetrieveClassName.InnerClass",
  RetrieveClassName.InnerClass.class.getCanonicalName());
assertEquals("com.example.RetrieveClassName$InnerClass",
  RetrieveClassName.InnerClass.class.getName());
assertEquals("com.example.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, sondernthey also don’t have a canonical name. Daher gibtgetCanonicalName() nichts zurück. In opposition to getSimpleName()getCanonicalName() will return null und keine leere Zeichenfolge, wenn eine anonyme Klasse aufgerufen wird.

getName() undgetTypeName() gebencalling 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 zurück.

Lassen Sie uns dies anhand eines Beispiels veranschaulichen. Wir erstellen hier zwei anonyme Klassen und rufengetName() beim ersten undgetTypeName() ohn beim zweiten Sohn auf und deklarieren sie incom.example.Main:

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

Wir sollten beachten, dass der zweite Aufruf einen Namen mit einer erhöhten Nummer am Ende zurückgibt, wie 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. The getTypeName() and getCanonicalName() methods will append pairs of brackets to their result.

Sehen wir uns das folgende Beispiel an, in dem wirgetTypeName() andgetCanonicalName() in einem zweidimensionalenInnerClass-Array aufrufen:

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

Beachten Sie, dass beim ersten Aufruf ein Dollar anstelle eines Punkts verwendet wird, um den inneren Klassenteil vom Rest des Namens zu trennen.

Lassen Sie uns nun sehen, wie die MethodegetName()funktioniert. Wenn es für ein Array vom primitiven Typ aufgerufen wird, gibt esan opening bracket and a letter representing the primitive type. zurück.

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

Wenn es dagegen für ein Objektarray aufgerufen wird, wird esadd an opening bracket and the L letter to its standard result and finish with a semi-colon. Versuchen wir es mit einem Array vonRetrieveClassName:

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

4. Fazit

In diesem Artikel haben wir uns vier Methoden für den Zugriff auf einen Klassennamen in Java angesehen. Diese Methoden sind:getSimpleName(), getName(), getTypeName() undgetCanonicalName().

Wir haben erfahren, dass der erste nur den Quellcodenamen einer Klasse zurückgibt, während die anderen mehr Informationen wie den Paketnamen und eine Angabe darüber liefern, ob die Klasse eine innere oder eine anonyme Klasse ist.

Der Code dieses Artikels istover on GitHub.