A különbség az a.getClass () és az A. osztály között a Java-ban
1. Áttekintés
Java-ban osztály java.lang.Osztály minden reflexiós művelet belépési pontja. Ha van egy tárgyunk java.lang.Osztály, akkor a megfelelő módszereket meghívhatjuk a reflexiós osztályok objektumainak megszerzésére.
Ebben az oktatóanyagban megvitatjuk az objektum megszerzésének két különböző módja közötti különbségeket java.lang.Osztály:
- Felhívás a Object.getClass () módszer
- Használni a .osztály szintaxis
2. A két megközelítés rövid bemutatása
A Object.getClass () metódus a Tárgy osztály. Ha van tárgyunk, hívhatunk object.getClass () hogy megkapja a Osztály típusú objektuma.
Hasonlóképpen használhatjuk a ClassName.class szintaxist a Osztály típusú objektum. Egy példa világosan megmagyarázhatja:
@Test public void givenObjectAndType_whenGettingClassObject_thenTwoMethodsHaveTheSameResult () {String str = "A String osztály objektuma vagyok"; Osztály fromStrObject = str.getClass (); Class clazz = Karakterlánc.osztály; assertSame (fromStrObject, clazz); }
A fenti vizsgálati módszerben megpróbáljuk megszerezni a Osztály tárgya Húr osztály az általunk említett két módon. Végül az állítási módszer azt mondja nekünk, hogy a kettő Osztály az objektumok ugyanazok a példányok.
A két megközelítés között azonban vannak különbségek. Vizsgáljuk meg őket közelebbről.
3. A futásidejű típus és a statikus típus
Nézzük át gyorsan az előző példát. Amikor felhívjuk a str.getClass () módszerrel megkapjuk a str tárgy. Másrészről, Karakterlánc.osztály értékeli a Húr osztály statikusan. Ebben a példában a str és a Karakterlánc.osztály ugyanazok.
Különbözőek lehetnek azonban, ha az osztályöröklés csatlakozik a párthoz. Lássunk két egyszerű osztályt:
public class Animal {védett int numberOfEyes; } public class Monkey kiterjeszti az állatot {// majom cucc}
Most példázzunk egy objektumot a Állat osztály és végezzen még egy tesztet:
@Test public void givenClassInheritance_whenGettingRuntimeTypeAndStaticType_thenGetDifferResult () {Animal animal = new Monkey (); Class runtimeType = animal.getClass (); Class staticType = Animal.class; assertSame (staticType, runtimeType); }
Ha lefuttatjuk a fenti tesztet, akkor egy teszthibát kapunk:
java.lang.AssertionError: .... Várható: class com.baeldung.getclassobject.Animal Actual: class com.baeldung.getclassobject.Monkey
A vizsgálati módszerben még akkor is, ha a állat objektum által Állati állat = új majom (); ahelyett Majomállat = új Majom ();, a. futásidejének típusa állat tárgy még mindig Majom. Ez azért van, mert a állat Az objektum a Majom futás közben.
Amikor azonban megkapjuk a statikus típusát Állat osztály, a típus mindig az Állat.
4. A primitív típusok kezelése
Amikor Java-kódot írunk, elég gyakran használunk primitív típusokat. Próbáljuk meg megszerezni a Osztály primitív típusú objektum a object.getClass () megközelítés:
int szám = 7; Class numberClass = szám.getClass ();
Ha megpróbáljuk lefordítani a fenti kódot, fordítási hibát kapunk:
Hiba: java: int nem vonható le
A fordító nem vonhatja le a következőket: szám változó, mivel ez egy primitív változó. Ebből kifolyólag, a object.getClass () módszer nem segíthet nekünk a Osztály primitív típusú tárgy.
Lássuk, megkapjuk-e a primitív típust a .osztály szintaxis:
@Test public void givenPrimitiveType_whenGettingClassObject_thenOnlyStaticTypeWorks () {Class intType = int.class; assertNotNull (intType); assertEquals ("int", intType.getName ()); assertTrue (intType.isPrimitive ()); }
Tehát megszerezhetjük a Osztály tárgya int primitív típusú keresztül int.osztály. Java 9-es és újabb verziókban a Osztály primitív típusú objektum a java.base modul.
Amint a teszt mutatja, a .osztály a szintaxis egyszerű módja a Osztály primitív típusú tárgy.
5. Az osztály megszerzése példány nélkül
Megtudtuk, hogy a object.getClass () módszer megadhatja nekünk a Osztály futásidejű objektuma.
Vizsgáljuk meg azt az esetet, amikor a Osztály típusú objektum, de nem tudjuk megszerezni a céltípus példányát, mert az absztrakt osztály, an felület, vagy valamelyik osztály nem engedélyezi a példányosítást:
public abstract class SomeAbstractClass {// ...} interfész SomeInterface {// néhány módszer ...} public class SomeUtils {private SomeUtils () {dobjon új RuntimeException-t ("Ezt az Util osztályt nem szabad példányosítani!"); } // néhány nyilvános statikus módszer ...}
Ezekben az esetekben nem tudjuk megszerezni a Osztály típusú objektumok a object.getClass () módszer, de továbbra is használhatjuk a .osztály szintaxist a Osztály tárgyakat tőlük:
@Test public void givenTypeCannotInstantiate_whenGetTypeStatically_thenGetTypesSuccefully () {Class interfaceType = SomeInterface.class; Class abstractClassType = SomeAbstractClass.class; Class utilClassType = SomeUtils.class; assertNotNull (interfaceType); assertTrue (interfaceType.isInterface ()); assertEquals ("SomeInterface", interfaceType.getSimpleName ()); assertNotNull (abstractClassType); assertEquals ("SomeAbstractClass", abstractClassType.getSimpleName ()); assertNotNull (utilClassType); assertEquals ("SomeUtils", utilClassType.getSimpleName ()); }
Amint a fenti teszt mutatja, a .osztály a szintaxis megszerezheti a Osztály objektumok azokhoz a típusokhoz.
Ebből kifolyólag, amikor meg akarjuk szerezni a Osztály objektumot, de nem kaphatunk ilyen típusú példányt, a .osztály a szintaxis az út.
6. Következtetés
Ebben a cikkben két különböző módszert tanultunk meg a Osztály típusú objektum: a object.getClass () módszer és a .osztály szintaxis.
Később megvitattuk a két megközelítés közötti különbséget. A következő táblázat egyértelmű áttekintést adhat:
object.getClass () | SomeClass.class | |
---|---|---|
Osztály objektumok | A futásidejű tárgy | A statikus típusa SomeClass |
Primitív típusok | — | Egyszerűen működik |
Felületek, absztrakt osztályok vagy olyan osztályok, amelyek nem példányosíthatók | — | Egyszerűen működik |
Mint mindig, a cikk teljes forráskódja elérhető a GitHubon.