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 objektumokA futásidejű tárgyA statikus típusa SomeClass
Primitív típusokEgyszerűen működik
Felületek, absztrakt osztályok vagy olyan osztályok, amelyek nem példányosíthatókEgyszerűen működik

Mint mindig, a cikk teljes forráskódja elérhető a GitHubon.