Razlika između a.getClass () i A.class u Javi

1. Pregled

U Javi, razred java.lang.Clasa je ulazna točka svih operacija refleksije. Jednom kad imamo objekt od java.lang.Clasa, tada možemo nazvati odgovarajuće metode za dobivanje objekata klasa refleksije.

U ovom uputstvu razgovarat ćemo o razlikama između dva različita načina dobivanja predmeta java.lang.Clasa:

  • Pozivanje Object.getClass () metoda
  • Koristiti .razred sintaksa

2. Kratki uvod u dva pristupa

The Object.getClass () metoda je instancijska metoda Objekt razred. Ako imamo objekt, možemo nazvati object.getClass () da biste dobili Razred objekt svog tipa.

Slično tome, možemo koristiti ClassName.class sintaksa za dobivanje Razred objekt tipa. Primjer to može jasno objasniti:

@Test javna praznina givenObjectAndType_whenGettingClassObject_thenTwoMethodsHaveTheSameResult () {String str = "Ja sam objekt klase String"; Klasa izStrObject = str.getClass (); Klasa klazz = String.class; assertSame (fromStrObject, clazz); } 

U gornjoj testnoj metodi pokušavamo dobiti Razred objekt Niz klasa na dva načina koja smo spomenuli. Napokon, metoda tvrdnje govori nam da to dvoje Razred objekti su ista instanca.

Međutim, postoje razlike između dva pristupa. Pogledajmo ih izbliza.

3. Vrsta izvođenja u odnosu na statički tip

Pogledajmo brzo prethodni primjer. Kad nazovemo str.getClass () metodom dobivamo tip vremena izvođenja str objekt. S druge strane, String.razred ocjenjuje Niz razred statički. U ovom primjeru, vrsta izvođenja str i String.razred isti su.

Međutim, mogu se razlikovati ako se nasljeđe klasa pridruži stranci. Pogledajmo dvije jednostavne klase:

javna klasa Animal {zaštićen int brojOfEyes; } javna klasa Majmun proširuje životinju {// majmunske stvari}

Sada napravimo instanciranje objekta Životinja predavanja i napravite još jedan test:

@Test javna praznina givenClassInheritance_whenGettingRuntimeTypeAndStaticType_thenGetDifferentResult () {Životinjska životinja = novi majmun (); Klasa runtimeType = animal.getClass (); Klasa staticType = Animal.class; assertSame (staticType, runtimeType); } 

Ako pokrenemo gornji test, dobit ćemo testni neuspjeh:

java.lang.AssertionError: .... Očekivano: class com.baeldung.getclassobject.Animal Actual: class com.baeldung.getclassobject.Monkey

U testnoj metodi, čak i ako smo napravili instancu životinja usprotiviti se Životinjska životinja = novi Majmun (); umjesto Majmunska životinja = novi Majmun ();, vrsta izvođenja datoteke životinja objekt je još uvijek Majmun. To je zato što životinja objekt je instanca Majmun za vrijeme izvođenja.

Međutim, kada dobijemo statički tip Životinja razred, tip je uvijek Životinja.

4. Rukovanje primitivnim vrstama

Kada pišemo Java kôd, prilično se često koristimo primitivnim vrstama. Pokušajmo dobiti a Razred objekt primitivnog tipa pomoću object.getClass () pristup:

int broj = 7; Klasa numberClass = number.getClass ();

Ako pokušamo sastaviti gornji kod, dobit ćemo pogrešku pri kompilaciji:

Pogreška: java: int ne može se dereferencirati

Prevoditelj ne može dereferencirati broj varijabla jer je to primitivna varijabla. Stoga, the object.getClass () metoda nam ne može pomoći Razred objekt primitivnog tipa.

Pogledajmo možemo li primitivni tip dobiti pomoću .razred sintaksa:

@Test javna praznina givenPrimitiveType_whenGettingClassObject_thenOnlyStaticTypeWorks () {Class intType = int.class; assertNotNull (intType); assertEquals ("int", intType.getName ()); assertTrue (intType.isPrimitive ()); } 

Dakle, možemo dobiti Razred objekt int primitivni tip kroz int.razred. U Javi verzije 9 i novijim, a Razred objekt primitivnog tipa pripada java.baza modul.

Kao što pokazuje test, the .razred sintaksa je jednostavan način za dobivanje Razred objekt primitivnog tipa.

5. Dobivanje predavanja bez trenutka

Saznali smo da object.getClass () metoda može nam dati Razred objekt svog runtime tipa.

Sada, razmotrimo slučaj kada želimo dobiti a Razred objekt tipa, ali ne možemo dobiti instancu ciljnog tipa jer je sažetak razred, an sučelje, ili neka klasa ne dopušta instanciranje:

javna apstraktna klasa SomeAbstractClass {// ...} sučelje SomeInterface {// neke metode ...} javna klasa SomeUtils {private SomeUtils () {throw new RuntimeException ("Ova klasa Util ne smije biti instancirana!"); } // neke javne statičke metode ...} 

U tim slučajevima ne možemo dobiti Razred objekti tih vrsta pomoću object.getClass () metoda, ali još uvijek možemo koristiti .razred sintaksa za dobivanje Razred predmeta od njih:

@Test javna praznina givenTypeCannotInstantiate_whenGetTypeStatically_thenGetTypesSuccefully () {Class interfaceType = SomeInterface.class; Klasa abstractClassType = SomeAbstractClass.class; Klasa utilClassType = SomeUtils.class; assertNotNull (vrsta sučelja); assertTrue (interfaceType.isInterface ()); assertEquals ("SomeInterface", interfaceType.getSimpleName ()); assertNotNull (abstractClassType); assertEquals ("SomeAbstractClass", abstractClassType.getSimpleName ()); assertNotNull (utilClassType); assertEquals ("SomeUtils", utilClassType.getSimpleName ()); } 

Kao što pokazuje gornji test, .razred sintaksa može dobiti Razred objekti za te vrste.

Stoga, kada želimo imati Razred objekt, ali ne možemo dobiti primjerak tipa, .razred sintaksa je put kojim treba ići.

6. Zaključak

U ovom smo članku naučili dva različita načina za dobivanje Razred objekt tipa: object.getClass () metoda i .razred sintaksa.

Kasnije smo razgovarali o razlici između dva pristupa. Sljedeća tablica može nam dati jasan pregled:

object.getClass ()SomeClass.class
Predmeti klaseVrsta izvođenja objektStatički tip Neka klasa
Primitivni tipoviDjeluje izravno
Sučelja, apstraktne klase ili klase koje se ne mogu instanciratiDjeluje izravno

Kao i uvijek, puni izvorni kôd članka dostupan je na GitHub-u.