Een klassenaam ophalen in Java

1. Overzicht

In deze zelfstudie leren we vier manieren om de naam van een klasse op te halen uit methoden op het Klasse API: getSimpleName (), getName (), getTypeName () en getCanonicalName ().

Deze methoden kunnen verwarrend zijn vanwege hun vergelijkbare namen en hun ietwat vage Javadocs. Ze hebben ook enkele nuances als het gaat om primitieve typen, objecttypen, innerlijke of anonieme klassen en arrays.

2. Ophalen van een eenvoudige naam

Laten we beginnen met de getSimpleName () methode.

In Java zijn er twee soorten namen: gemakkelijk en gekwalificeerd. Een eenvoudige naam bestaat uit een unieke identificatie, terwijl een gekwalificeerde naam een ​​reeks eenvoudige namen is, gescheiden door punten.

Zoals de naam suggereert, getSimpleName () geeft de eenvoudige naam van de onderliggende klasse terug, dat wil zeggen de naam die het is gegeven in de broncode.

Laten we ons de volgende klasse voorstellen:

pakket com.baeldung.className; openbare klasse RetrieveClassName {}

Zijn simpele naam zou zijn RetrieveClassName:

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

We kunnen ook eenvoudige namen voor primitieve typen en arrays krijgen. Voor primitieve typen zullen dat gewoon hun namen zijn, zoals int, booleaanse of vlotter.

En voor arrays zal de methode terugkeren de eenvoudige naam van het type array, gevolgd door een paar haakjes openen en sluiten voor elke dimensie van de array ([]):

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

Bijgevolg voor een tweedimensionaal Draad array, aanroepend getSimpleName () op zijn klasse zal terugkeren Draad[][].

Ten slotte is er het specifieke geval van anonieme klassen. Roeping getSimpleName () op een anonieme klasse zal een lege string retourneren.

3. Andere namen ophalen

Nu is het tijd om te kijken hoe we de naam van een klas, type naam of canonieke naam kunnen verkrijgen. in tegenstelling tot getSimpleName ()Deze namen zijn bedoeld om meer informatie over de klas te geven.

De getCanonicalName () methode retourneert altijd de canonieke naam zoals gedefinieerd in de Java-taalspecificatie.

Wat betreft de andere methoden, de output kan een klein beetje verschillen naargelang de gebruiksscenario's. We zullen zien wat dat betekent voor verschillende primitieve en objecttypes.

3.1. Primitieve typen

Laten we beginnen met primitieve typen, omdat ze eenvoudig zijn. Voor primitieve typen, alle drie de methoden getName (), getTypeName () en getCanonicalName () retourneert hetzelfde resultaat als getSimpleName ():

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

3.2. Objecttypes

We zullen nu zien hoe deze methoden werken met objecttypen. Hun gedrag is over het algemeen hetzelfde: ze geven allemaal de canonieke naam van de klas terug.

In de meeste gevallen is dit een gekwalificeerde naam die alle eenvoudige namen van klassepakketten bevat, evenals de eenvoudige naam van de klasse:

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. Innerlijke klassen

Wat we in de vorige sectie hebben gezien, is het algemene gedrag van deze methodeaanroepen, maar er zijn een paar uitzonderingen.

Innerlijke klassen zijn er een van. De getName () en getTypeName () methoden gedragen zich anders dan de getCanonicalName () methode voor innerlijke klassen.

getCanonicalName () retourneert nog steeds de canonieke naam van de klasse, dat is de omsluitende klasse canonieke naam plus de binnenste klasse eenvoudige naam gescheiden door een punt.

Aan de andere kant is het getName () en getTypeName () methoden retourneren vrijwel hetzelfde, maar gebruik een dollar als scheidingsteken tussen de canonieke naam van de omsluitende klasse en de eenvoudige naam van de binnenste klasse.

Laten we ons een innerlijke klasse voorstellen InnerClass van onze RetrieveClassName:

openbare klasse RetrieveClassName {openbare klasse InnerClass {}}

Dan geeft elke aanroep de innerlijke klasse op een iets andere manier aan:

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. Anonieme lessen

Anonieme lessen zijn een andere uitzondering.

Zoals we al hebben gezien, hebben ze geen eenvoudige naam, maar ze hebben ook geen canonieke naam. Daarom getCanonicalName () retourneert niets. In tegenstelling tot getSimpleName (), getCanonicalName () zal terugkeren nulen niet een lege string bij het aanroepen van een anonieme klasse.

Wat betreft getName () en getTypeName () zij zullen de canonieke naam van de aanroepende klasse gevolgd door een dollar en een getal dat de positie van de anonieme klasse vertegenwoordigt tussen alle anonieme klassen die in de aanroepende klasse zijn gemaakt.

Laten we dit illustreren met een voorbeeld. We maken hier twee anonieme klassen en bellen getName () op de eerste en getTypeName () op de tweede, ze aangeven in com.baeldung.Main:

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

We moeten opmerken dat de tweede oproep een naam retourneert met een verhoogd nummer aan het einde, omdat deze wordt toegepast op de tweede anonieme klasse.

3.5. Arrays

Laten we tot slot eens kijken hoe arrays worden afgehandeld door de bovenstaande drie methoden.

Om aan te geven dat we te maken hebben met arrays, zal elke methode het standaardresultaat bijwerken. De getTypeName () en getCanonicalName () methodes zullen paar haakjes aan hun resultaat toevoegen.

Laten we het volgende voorbeeld bekijken waar we bellen getTypeName () en getCanonicalName () op een tweedimensionaal InnerClass matrix:

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

Merk op hoe de eerste aanroep een dollar gebruikt in plaats van een punt om het binnenste klassegedeelte te scheiden van de rest van de naam.

Laten we nu eens kijken hoe de getName () methode werkt. Wanneer het wordt aangeroepen op een primitief type array, zal het terugkeren een openingshaakje en een letter die het primitieve type voorstelt.Laten we dat controleren met het volgende voorbeeld, waarbij we die methode aanroepen op een tweedimensionale array met primitieve gehele getallen:

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

Aan de andere kant, wanneer het wordt aangeroepen op een object-array, zal het dat wel doen voeg een openingshaakje en de L-letter toe aan het standaardresultaat en eindig met een puntkomma. Laten we het proberen op een reeks van RetrieveClassName:

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

4. Conclusie

In dit artikel hebben we gekeken naar vier methoden om toegang te krijgen tot een klassenaam in Java. Deze methoden zijn: getSimpleName (), getName (), getTypeName () en getCanonicalName ().

We hebben geleerd dat de eerste alleen de broncodenaam van een klasse retourneert, terwijl de andere meer informatie geven, zoals de pakketnaam en een indicatie of de klasse een innerlijke of een anonieme klasse is.

De code van dit artikel is te vinden op GitHub.