Načítanie názvu triedy v jazyku Java

1. Prehľad

V tomto výučbe sa dozvieme o štyroch spôsoboch získania názvu triedy z metód na serveri Trieda API: getSimpleName (), getName (), getTypeName () a getCanonicalName ().

Tieto metódy môžu byť mätúce kvôli podobným názvom a trochu neurčitým javadocs. Majú tiež určité nuansy, pokiaľ ide o primitívne typy, typy objektov, vnútorné alebo anonymné triedy a polia.

2. Načítanie jednoduchého mena

Začnime s getSimpleName () metóda.

V prostredí Java existujú dva druhy mien: jednoduché a kvalifikovaný. Jednoduchý názov pozostáva z jedinečného identifikátora, zatiaľ čo kvalifikovaný názov je sled jednoduchých mien oddelených bodkami.

Ako naznačuje jeho názov, getSimpleName () vráti jednoduchý názov základnej triedy, to znamená názov, ktorý dostal v zdrojovom kóde.

Poďme si predstaviť nasledujúcu triedu:

balíček com.baeldung.className; verejná trieda RetrieveClassName {}

Jeho jednoduchý názov by bol RetrieveClassName:

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

Môžeme tiež získať primitívne typy a zostaviť jednoduché názvy. Pre primitívne typy, ktoré budú jednoducho ich názvy, napríklad int, boolean alebo plavák.

A pre polia sa metóda vráti jednoduchý názov typu poľa, za ktorým nasleduje dvojica otváracích a zatváracích zátvoriek pre každú dimenziu poľa ([]):

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

V dôsledku toho pre dvojrozmerný String pole, volanie getSimpleName () na svojej triede sa vráti Reťazec [] [].

Nakoniec je tu konkrétny prípad anonymných tried. Telefonovanie getSimpleName () na anonymnej triede vráti prázdny reťazec.

3. Načítanie ďalších mien

Teraz je čas sa pozrieť na to, ako by sme získali názov triedy, názov typu alebo kanonický názov. Na rozdiel od getSimpleName (), cieľom týchto mien je poskytnúť viac informácií o triede.

The getCanonicalName () metóda vždy vráti kanonický názov ako je definované v špecifikácii jazyka Java.

Pokiaľ ide o ostatné metódy, výstup sa môže trochu líšiť podľa prípadov použitia. Uvidíme, čo to znamená pre rôzne primitívne a typy objektov.

3.1. Primitívne typy

Začnime s primitívnymi typmi, pretože sú jednoduché. Pre primitívne typy všetky tri metódy getName (), getTypeName () a getCanonicalName () vráti rovnaký výsledok ako getSimpleName ():

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

3.2. Typy objektov

Teraz uvidíme, ako tieto metódy fungujú s typmi objektov. Ich správanie je vo všeobecnosti rovnaké: všetci vrátia kanonický názov triedy.

Vo väčšine prípadov sa jedná o kvalifikovaný názov, ktorý obsahuje všetky jednoduché názvy balíkov tried, ako aj jednoduchý názov triedy:

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. Vnútorné triedy

To, čo sme videli v predchádzajúcej časti, je všeobecné správanie týchto volaní metód, existuje však niekoľko výnimiek.

Jednou z nich sú aj vnútorné triedy. The getName () a getTypeName () metódy sa správajú inak ako getCanonicalName () metóda pre vnútorné triedy.

getCanonicalName () stále vracia kanonický názov triedy, to je kanonický názov uzatvárajúcej triedy plus jednoduchý názov vnútornej triedy oddelený bodkou.

Na druhej strane getName () a getTypeName () metódy sa vracajú skoro rovnako, ale použite dolár ako oddeľovač medzi kanonickým názvom uzatvárajúcej triedy a jednoduchým názvom vnútornej triedy.

Poďme si predstaviť vnútornú triedu InnerClass nášho RetrieveClassName:

verejná trieda RetrieveClassName {verejná trieda InnerClass {}}

Potom každé volanie označuje vnútornú triedu trochu iným spôsobom:

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. Anonymné triedy

Anonymné triedy sú ďalšou výnimkou.

Ako sme už videli, nemajú jednoduché meno, ale tiež nemajú kanonický názov. Preto getCanonicalName () nič nevracia. V opozícii k getSimpleName (), getCanonicalName () vráti sa nulovýa nie prázdny reťazec, keď je vyvolaný v anonymnej triede.

Ako pre getName () a getTypeName () vrátia kanonický názov volajúcej triedy, za ktorým nasleduje dolár a číslo predstavujúce pozíciu anonymnej triedy medzi všetkými anonymnými triedami vytvorenými vo volajúcej triede.

Poďme si to ilustrovať na príklade. Vytvoríme tu dve anonymné triedy a zavoláme getName () na prvom a getTypeName () na druhej strane ich vyhlásením za com.baeldung.Hlavná:

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

Mali by sme poznamenať, že druhé volanie vráti meno so zvýšeným počtom na konci, ako sa používa v druhej anonymnej triede.

3.5. Polia

Na záver sa pozrime, ako sa s poliami zaobchádza pomocou vyššie uvedených troch metód.

Každá metóda aktualizuje svoj štandardný výsledok, aby naznačila, že máme do činenia s poľami. The getTypeName () a getCanonicalName () metódy k výsledku pridajú dvojice zátvoriek.

Pozrime sa na nasledujúci príklad, kde voláme getTypeName () a getCanonicalName () na dvojrozmernom InnerClass pole:

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

Všimnite si, ako prvé volanie používa dolár namiesto bodky na oddelenie časti vnútornej triedy od zvyšku mena.

Pozrime sa teraz, ako getName () metóda funguje. Pri volaní na pole primitívneho typu sa vráti otváracia zátvorka a písmeno predstavujúce primitívny typ.Poďme to skontrolovať v nasledujúcom príklade, keď túto metódu zavoláme na dvojdimenzionálne primitívne celé pole:

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

Na druhej strane, keď sa vyvolá na poli objektov, bude pridajte úvodnú zátvorku a písmeno L k štandardnému výsledku a ukončite bodkočiarkou. Skúsme to na rade RetrieveClassName:

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

4. Záver

V tomto článku sme sa zaoberali štyrmi metódami prístupu k názvu triedy v jazyku Java. Ide o tieto metódy: getSimpleName (), getName (), getTypeName () a getCanonicalName ().

Dozvedeli sme sa, že prvý iba vracia názov zdrojového kódu triedy, zatiaľ čo ostatné poskytujú viac informácií, ako je napríklad názov balíka a označenie, či je trieda vnútorná alebo anonymná.

Kód tohto článku nájdete na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found