Henter et klassenavn i Java

1. Oversigt

I denne vejledning lærer vi om fire måder at hente en klasses navn fra metoder på Klasse API: getSimpleName (), getName (), getTypeName () og getCanonicalName ().

Disse metoder kan være forvirrende på grund af deres lignende navne og deres noget vage Javadocs. De har også nogle nuancer, når det kommer til primitive typer, objekttyper, indre eller anonyme klasser og arrays.

2. Henter simpelt navn

Lad os begynde med getSimpleName () metode.

I Java er der to slags navne: enkel og kvalificeret. Et simpelt navn består af en unik identifikator, mens et kvalificeret navn er en sekvens af enkle navne adskilt af prikker.

Som navnet antyder, getSimpleName () returnerer det enkle navn på den underliggende klasse, dvs. navnet det er givet i kildekoden.

Lad os forestille os følgende klasse:

pakke com.baeldung.className; offentlig klasse RetrieveClassName {}

Dens enkle navn ville være RetrieveClassName:

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

Vi kan også få primitive typer og arrays enkle navne. For primitive typer, der simpelthen vil være deres navne, ligesom int, boolsk eller flyde.

Og for arrays vender metoden tilbage det enkle navn på matrixtypen efterfulgt af et par åbnings- og lukningsbeslag for hver dimension i arrayet ([]):

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

Derfor for en todimensional Snor array, der ringer getSimpleName () på sin klasse vender tilbage Snor[][].

Endelig er der det specifikke tilfælde af anonyme klasser. Ringer getSimpleName () på en anonym klasse returnerer en tom streng.

3. Hentning af andre navne

Nu er det tid til at se på, hvordan vi ville få en klasses navn, type navn eller kanoniske navn. I modsætning til getSimpleName (), disse navne sigter mod at give mere information om klassen.

Det getCanonicalName () metoden returnerer altid det kanoniske navn som defineret i Java Language Specification.

Hvad angår de andre metoder, kan output variere lidt alt efter brugssagerne. Vi får se, hvad det betyder for forskellige primitive og objekttyper.

3.1. Primitive typer

Lad os starte med primitive typer, da de er enkle. For primitive typer, alle tre metoder getName (), getTypeName () og getCanonicalName () returnerer det samme resultat som getSimpleName ():

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

3.2. Objekttyper

Vi ser nu, hvordan disse metoder fungerer med objekttyper. Deres adfærd er generelt den samme: de returnerer alle klassens kanoniske navn.

I de fleste tilfælde er dette et kvalificeret navn, der indeholder alle klassepakkens enkle navne såvel som klassens enkle navn:

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. Indre klasser

Hvad vi har set i det foregående afsnit er den generelle opførsel af disse metodekald, men der er et par undtagelser.

Indre klasser er en af ​​dem. Det getName () og getTypeName () metoder opfører sig anderledes end getCanonicalName () metode til indre klasser.

getCanonicalName () returnerer stadig klassens kanoniske navn, det er det vedlagte klasse kanoniske navn plus det indre klasses enkle navn adskilt af en prik.

På den anden side er getName () og getTypeName () Metoder vender stort set det samme, men Brug en dollar som skilletegn mellem det omsluttende klassiske kanoniske navn og det indre klasses enkle navn.

Lad os forestille os en indre klasse InnerClass af vores RetrieveClassName:

offentlig klasse RetrieveClassName {offentlig klasse InnerClass {}}

Derefter betegner hvert opkald den indre klasse på en lidt anden måde:

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 klasser

Anonyme klasser er en anden undtagelse.

Som vi allerede har set, har de ikke noget enkelt navn, men de har heller ikke et kanonisk navn. Derfor, getCanonicalName () returnerer ikke noget. I opposition til getSimpleName (), getCanonicalName () kommer tilbage nulog ikke en tom streng, når der kaldes til en anonym klasse.

Som for getName () og getTypeName () de vil returnere kaldende klasses kanoniske navn efterfulgt af en dollar og et tal, der repræsenterer placeringen af ​​den anonyme klasse blandt alle anonyme klasser oprettet i den kaldende klasse.

Lad os illustrere dette med et eksempel. Vi opretter her to anonyme klasser og ringer getName () på den første og getTypeName () på den anden, erklære dem i com.baeldung.Hoved:

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

Vi skal bemærke, at det andet opkald returnerer et navn med et øget antal i slutningen, da det anvendes på den anden anonyme klasse.

3.5. Arrays

Lad os endelig se, hvordan arrays håndteres ved hjælp af ovenstående tre metoder.

For at indikere, at vi har med arrays at gøre, opdaterer hver metode sit standardresultat. Det getTypeName () og getCanonicalName () metoder tilføjer par parenteser til deres resultat.

Lad os se følgende eksempel, hvor vi kalder getTypeName () og getCanonicalName () på en todimensional InnerClass matrix:

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

Bemærk, hvordan det første opkald bruger en dollar i stedet for en prik til at adskille den indre klassedel fra resten af ​​navnet.

Lad os nu se, hvordan getName () metoden fungerer. Når der kaldes på en primitiv type array, vender den tilbage et åbningsbeslag og et bogstav, der repræsenterer den primitive type.Lad os kontrollere det med følgende eksempel ved at kalde den metode på et bidimensionelt primitivt heltal-array:

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

På den anden side, når det kaldes på et objekt array, vil det tilføj et åbningsbeslag og L-bogstavet til standardresultatet, og afslut med en semikolon. Lad os prøve det på en række RetrieveClassName:

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

4. Konklusion

I denne artikel så vi på fire metoder til at få adgang til et klassenavn i Java. Disse metoder er: getSimpleName (), getName (), getTypeName () og getCanonicalName ().

Vi lærte, at den første bare returnerer kildekodenavnet på en klasse, mens de andre giver mere information såsom pakkenavn og en indikation af, om klassen er indre eller en anonym klasse.

Koden til denne artikel kan findes på GitHub.