Dohvaćanje naziva klase u Javi

1. Pregled

U ovom uputstvu naučit ćemo o četiri načina za dohvaćanje imena klase iz metoda na Razred API: getSimpleName (), getName (), getTypeName () i getCanonicalName ().

Ove metode mogu zbuniti zbog sličnih naziva i pomalo neodređenih Javadocs-a. Oni također imaju neke nijanse kada su u pitanju primitivni tipovi, tipovi objekata, unutarnje ili anonimne klase i nizovi.

2. Dohvaćanje jednostavnog imena

Počnimo s getSimpleName () metoda.

U Javi postoje dvije vrste imena: jednostavan i kvalificirani. Jednostavno ime sastoji se od jedinstvenog identifikatora, dok je kvalificirano ime slijed jednostavnih imena odvojenih točkama.

Kao što mu samo ime govori, getSimpleName () vraća jednostavno ime osnovne klase, tj ime koje je dato u izvornom kodu.

Zamislimo sljedeći razred:

paket com.baeldung.className; javna klasa RetrieveClassName {}

Njegov bi jednostavan naziv bio RetrieveClassName:

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

Također možemo dobiti primitivne tipove i nizove jednostavnih imena. Za primitivne tipove koji će jednostavno biti njihova imena, poput int, logička vrijednost ili plutati.

A za nizove će se metoda vratiti jednostavan naziv vrste polja nakon kojeg slijedi par zagrada za otvaranje i zatvaranje za svaku dimenziju niza ([]):

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

Slijedom toga, za dvodimenzionalnu Niz niz, pozivanje getSimpleName () na svojoj klasi će se vratiti Niz[][].

Konačno, tu je i specifičan slučaj anonimnih predavanja. Pozivanje getSimpleName () na anonimnoj klasi vratit će prazan niz.

3. Dohvaćanje drugih imena

Sada je vrijeme da pogledamo kako bismo dobili naziv klase, naziv tipa ili kanonski naziv. Za razliku od getSimpleName (), ovim imenima se želi dati više informacija o razredu.

The getCanonicalName () metoda uvijek vraća kanonski naziv kako je definirano u Specifikaciji jezika Java.

Što se tiče ostalih metoda, izlaz se može malo razlikovati ovisno o slučajevima korištenja. Vidjet ćemo što to znači za različite primitivne i objektne tipove.

3.1. Primitivni tipovi

Počnimo s primitivnim vrstama, jer su jednostavne. Za primitivne tipove, sve tri metode getName (), getTypeName () i getCanonicalName () vratit će isti rezultat kao getSimpleName ():

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

3.2. Vrste objekata

Sad ćemo vidjeti kako ove metode rade s vrstama objekata. Njihovo ponašanje je uglavnom isto: svi oni vraćaju kanonski naziv klase.

U većini slučajeva ovo je kvalificirano ime koje sadrži sva jednostavna imena paketa klasa, kao i jednostavno ime klase:

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. Unutarnja nastava

Ono što smo vidjeli u prethodnom odjeljku je opće ponašanje ovih poziva metode, ali postoji nekoliko iznimaka.

Unutarnji razredi su jedan od njih. The getName () i getTypeName () metode ponašaju se drugačije od getCanonicalName () metoda za unutarnju nastavu.

getCanonicalName () i dalje vraća kanonski naziv klase, to je kanonsko ime klase uz jednostavno ime unutarnje klase odvojeno točkom.

S druge strane, getName () i getTypeName () metode vraćaju gotovo iste, ali upotrijebite dolar kao separator između kanonskog naziva klase i jednostavnog naziva unutarnje klase.

Zamislimo unutarnju klasu InnerClass Od našeg RetrieveClassName:

javna klasa RetrieveClassName {javna klasa InnerClass {}}

Tada svaki poziv označava unutarnju klasu na malo drugačiji način:

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. Anonimni razredi

Anonimni razredi su još jedna iznimka.

Kao što smo već vidjeli, nemaju jednostavno ime, ali također nemaju kanonsko ime. Stoga, getCanonicalName () ne vraća ništa. Nasuprot getSimpleName (), getCanonicalName () će se vratiti nulla ne prazan niz kada se poziva na anonimnu klasu.

Što se tiče getName () i getTypeName () oni će vratiti kanonsko ime pozivne klase, nakon čega slijedi dolar i broj koji predstavlja položaj anonimne klase među svim anonimnim klasama stvorenim u pozivajućoj klasi.

Pokažimo to na primjeru. Ovdje ćemo stvoriti dva anonimna razreda i nazvati getName () na prvom i getTypeName () na drugoj, proglasivši ih u com.baeldung.Glavni:

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

Trebali bismo imati na umu da drugi poziv vraća ime s povećanim brojem na kraju, jer se primjenjuje na drugu anonimnu klasu.

3.5. Nizovi

Napokon, pogledajmo kako se s nizovima postupa s gore navedene tri metode.

Kako bi naznačilo da imamo posla s nizovima, svaka će metoda ažurirati svoj standardni rezultat. The getTypeName () i getCanonicalName () metode dodati će parove zagrada svom rezultatu.

Pogledajmo sljedeći primjer gdje zovemo getTypeName () i getCanonicalName () na dvodimenzionalnu InnerClass niz:

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

Imajte na umu kako prvi poziv koristi dolar umjesto točke za odvajanje dijela unutarnje klase od ostatka imena.

Pogledajmo sada kako getName () metoda djeluje. Kad se pozove na primitivni niz, vratit će se uvodna zagrada i slovo koje predstavlja primitivni tip.Provjerimo to sljedećim primjerom, pozivanjem te metode na dvodimenzionalnom primitivnom nizu:

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

S druge strane, kad se pozove na objektni niz, hoće dodajte zagradu za otvaranje i slovo L svom standardnom rezultatu i završite sa zarezom. Pokušajmo na nizu od RetrieveClassName:

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

4. Zaključak

U ovom smo članku pogledali četiri metode za pristup imenu klase u Javi. Te su metode: getSimpleName (), getName (), getTypeName () i getCanonicalName ().

Saznali smo da prvi samo vraća naziv izvornog koda klase, dok ostali pružaju više informacija poput naziva paketa i naznake je li klasa unutarnja ili anonimna klasa.

Kôd ovog članka možete pronaći na GitHubu.