Osztálynév lekérése Java-ban

1. Áttekintés

Ebben az oktatóanyagban megismerkedhetünk azzal, hogy miként lehet lekérni egy osztály nevét a Osztály API: getSimpleName (), getName (), getTypeName () és getCanonicalName ().

Ezek a módszerek zavaróak lehetnek hasonló nevük és kissé homályos Javadocik miatt. Van néhány árnyalatuk a primitív típusokról, az objektumtípusokról, a belső vagy anonim osztályokról és a tömbökről is.

2. Egyszerű név beolvasása

Kezdjük a getSimpleName () módszer.

A Java-ban kétféle név létezik: egyszerű és képzett. Az egyszerű név egy egyedi azonosítóból áll, míg a minősített név az egyszerű nevek pontokkal elválasztott sorozata.

Ahogy a neve is mutatja, getSimpleName () az alapul szolgáló osztály egyszerű nevét adja vissza, vagyis a forráskódban megadott név.

Képzeljük el a következő osztályt:

com.baeldung.className csomag; public class RetrieveClassName {}

Egyszerű neve az lenne RetrieveClassName:

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

Kapunk primitív típusokat és tömbök egyszerű neveit is. Olyan primitív típusokra, amelyek egyszerűen a nevük lesznek, például int, logikai vagy úszó.

A tömbök esetében a módszer visszatér a tömb típusának egyszerű neve, amelyet egy pár nyitó és záró zárójel követ a tömb minden dimenziójához ([]):

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

Következésképpen egy kétdimenziós Húr tömb, hívás getSimpleName () osztályában visszatér Húr[][].

Végül van egy névtelen osztályok egyedi esete. Hívás getSimpleName () egy névtelen osztályon üres karakterláncot ad vissza.

3. Más nevek lekérése

Itt az ideje, hogy megnézzük, hogyan szerezzük meg az osztály nevét, típusnevét vagy kanonikus nevét. nem úgy mint getSimpleName (), ezeknek a neveknek a célja, hogy több információt nyújtsanak az osztályról.

A getCanonicalName () metódus mindig visszaadja a kánoni nevet a Java nyelvi specifikációban meghatározottak szerint.

Ami a többi módszert illeti, a kimenet kissé eltérhet a felhasználási esettől függően. Meglátjuk, mit jelent ez a különböző primitív és objektumtípusok esetében.

3.1. Primitív típusok

Kezdjük a primitív típusokkal, mivel ezek egyszerűek. Primitív típusoknál mindhárom módszer getName (), getTypeName () és getCanonicalName () ugyanazt az eredményt adja vissza, mint getSimpleName ():

assertEquals ("int", int.osztály.getName ()); assertEquals ("int", int.osztály.getTypeName ()); assertEquals ("int", int.osztály.getCanonicalName ());

3.2. Objektumtípusok

Most megnézzük, hogyan működnek ezek a módszerek az objektumtípusokkal. Viselkedésük általában azonos: valamennyien visszaadják az osztály kanonikus nevét.

A legtöbb esetben ez egy minősített név, amely tartalmazza az összes osztálycsomag egyszerű nevét, valamint az osztály egyszerű nevét:

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. Belső osztályok

Amit az előző szakaszban láthattunk, az a módszerhívások általános viselkedése, de van néhány kivétel.

A belső osztályok közé tartozik. A getName () és getTypeName () módszerek másként viselkednek, mint a getCanonicalName () módszer a belső osztályok számára.

getCanonicalName () továbbra is az osztály kanonikus nevét adja vissza, ez a becsatoló osztály kanonikus neve, plusz a belső osztály egyszerű neve, ponttal elválasztva.

Másrészt a getName () és getTypeName () a módszerek nagyjából azonosak, de használjon dollárt elválasztóként a becsatoló osztály kanonikus neve és a belső osztály egyszerű neve között.

Képzeljünk el egy belső osztályt InnerClass a mi RetrieveClassName:

public class RetrieveClassName {public class InnerClass {}}

Ezután minden hívás kissé másképp jelöli a belső osztályt:

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. Névtelen osztályok

A név nélküli osztályok egy másik kivétel.

Mint már láthattuk, nincs egyszerű nevük, de kanonikus nevük sincs. Ebből kifolyólag, getCanonicalName () nem ad vissza semmit. Szemben a getSimpleName (), getCanonicalName () vissza fog térni nullaés nem egy üres karakterlánc, ha egy névtelen osztályt hívnak meg.

Ami getName () és getTypeName () visszaadják a hívóosztály kanonikus neve, amelyet egy dollár és egy szám követ, amely az anonim osztály pozícióját képviseli a hívó osztályban létrehozott összes névtelen osztály között.

Illusztráljuk ezt egy példával. Itt létrehozunk két névtelen osztályt, és felhívjuk getName () az első és getTypeName () a másodikon bevallva őket com.baeldung.Fő:

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

Meg kell jegyeznünk, hogy a második hívás egy olyan nevet ad vissza, amelynek végén megnövelt szám van, mivel a második névtelen osztályra alkalmazzák.

3.5. Tömbök

Végül nézzük meg, hogyan kezelik a tömböket a fenti három módszer.

Annak jelzésére, hogy tömbökkel foglalkozunk, minden módszer frissíti a szokásos eredményét. A getTypeName () és getCanonicalName () A módszerek zárójel párokat fűznek eredményükhöz.

Lássuk a következő példát, ahol hívjuk getTypeName () és getCanonicalName () kétdimenziós InnerClass sor:

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

Vegye figyelembe, hogy az első hívás egy pont helyett egy dollárt használ a belső osztályrész elválasztására a név többi részétől.

Most nézzük meg, hogyan getName () módszer működik. Ha meghív egy primitív típusú tömböt, akkor visszatér nyitó zárójel és egy betű a primitív típust képviseli.Ellenőrizzük, hogy a következő példával hívjuk meg ezt a módszert egy kétdimenziós primitív egész tömbre:

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

Másrészt, ha egy objektumtömböt meghívnak, az megtörténik adjon hozzá nyitó zárójelet és egy L betűt a szokásos eredményéhez, és végezzen pontosvesszővel. Próbáljuk ki a RetrieveClassName:

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

4. Következtetés

Ebben a cikkben négy módszert vizsgáltunk az osztálynév Java-alapú elérésére. Ezek a módszerek a következők: getSimpleName (), getName (), getTypeName () és getCanonicalName ().

Megtudtuk, hogy az első csak egy osztály forráskódjának nevét adja vissza, míg a többi további információt nyújt, például a csomag nevét, és jelzi, hogy az osztály belső vagy egy névtelen osztály.

A cikk kódja a GitHub oldalon található.