Forskellen mellem a.getClass () og A.class i Java

1. Oversigt

I Java, klassen java.lang.Klasse er indgangspunktet for alle refleksionsoperationer. Når vi har et objekt med java.lang.Klasse, kan vi derefter kalde de tilsvarende metoder for at få objekterne til refleksionsklasser.

I denne vejledning diskuterer vi forskellene mellem to forskellige måder at få et objekt på java.lang.Klasse:

  • Ringer til Object.getClass () metode
  • Bruger .klasse syntaks

2. Kort introduktion til de to fremgangsmåder

Det Object.getClass () metode er en instans metode til Objekt klasse. Hvis vi har et objekt, kan vi ringe object.getClass () at få Klasse objekt af sin type.

På samme måde kan vi bruge ClassName.class syntaks for at få Klasse objekt af typen. Et eksempel kan forklare det tydeligt:

@Test offentligt ugyldigt givenObjectAndType_whenGettingClassObject_thenTwoMethodsHaveTheSameResult () {String str = "Jeg er et objekt i klasse String"; Klasse fromStrObject = str.getClass (); Class clazz = String.class; assertSame (fraStrObject, clazz); } 

I ovenstående testmetode forsøger vi at få Klasse genstand for Snor klasse ved hjælp af de to måder, vi har nævnt. Endelig fortæller påstandsmetoden os, at de to Klasse objekter er den samme forekomst.

Der er dog forskelle mellem de to tilgange. Lad os se nærmere på dem.

3. Runtime-typen vs. den statiske type

Lad os gennemgå det foregående eksempel hurtigt. Når vi kalder str.getClass () metode, får vi runtime typen af str objekt. På den anden side, Streng.klasse evaluerer Snor klasse statisk. I dette eksempel er runtime-typen af str og Streng.klasse er det samme.

De kan dog være forskellige, hvis klassearv tilslutter sig festen. Lad os se to enkle klasser:

offentlig klasse Animal {beskyttet int numberOfEyes; } offentlig klasse Monkey udvider Animal {// monkey stuff}

Lad os nu instantiere et objekt fra Dyr klasse og lav en ny test:

@Test offentlig ugyldighed givenClassInheritance_whenGettingRuntimeTypeAndStaticType_thenGetDifferentResult () {Animal animal = new Monkey (); Klasse runtimeType = animal.getClass (); Klasse staticType = Animal.class; assertSame (staticType, runtimeType); } 

Hvis vi kører testen ovenfor, får vi en testfejl:

java.lang.AssertionError: .... Forventes: klasse com.baeldung.getclassobject.Animal Faktisk: klasse com.baeldung.getclassobject.Monkey

I testmetoden, selvom vi instantierede dyr indvende ved Dyredyr = ny abe (); i stedet for Abeedyr = ny abe ();, runtime-typen af dyr objektet er stadig Abe. Dette skyldes, at dyr objekt er en forekomst af Abe ved kørselstid.

Men når vi får den statiske type af Dyr klasse, typen er altid Dyr.

4. Håndtering af primitive typer

Når vi skriver Java-kode, bruger vi primitive typer ganske ofte. Lad os prøve at få en Klasse objekt af en primitiv type ved hjælp af object.getClass () nærme sig:

int tal = 7; Class numberClass = number.getClass ();

Hvis vi forsøger at kompilere koden ovenfor, får vi en kompileringsfejl:

Fejl: java: int kan ikke henvises til

Compileren kan ikke afvige fra nummer variabel, da den er en primitiv variabel. Derfor, det object.getClass () metode kan ikke hjælpe os med at få Klasse objekt af en primitiv type.

Lad os se, om vi kan få den primitive type ved hjælp af .klasse syntaks:

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

Så vi kan få Klasse genstand for int primitiv type igennem int.klasse. I Java version 9 og senere, a Klasse objekt af primitiv type hører til java.base modul.

Som testen viser, det .klasse syntaks er en nem måde at få Klasse objekt af en primitiv type.

5. At få klassen uden et tilfælde

Vi har lært, at object.getClass () metoden kan give os Klasse objekt af dets runtime-type.

Lad os nu overveje det tilfælde, hvor vi ønsker at få en Klasse objekt af en type, men vi kan ikke få en forekomst af måltypen, fordi den er en abstrakt klasse, en interface, eller en klasse tillader ikke instantiering:

offentlig abstrakt klasse SomeAbstractClass {// ...} grænseflade SomeInterface {// nogle metoder ...} offentlig klasse SomeUtils {private SomeUtils () {kast ny RuntimeException ("Denne Util-klasse må ikke instantieres!"); } // nogle offentlige statiske metoder ...} 

I disse tilfælde kan vi ikke få Klasse objekter af disse typer ved hjælp af object.getClass () metode, men vi kan stadig bruge .klasse syntaks for at opnå Klasse genstande af dem:

@Test offentlig ugyldighed 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 ()); } 

Som ovenstående test viser, er .klasse syntaks kan få Klasse objekter til disse typer.

Derfor, når vi ønsker at have Klasse objekt, men vi kan ikke få en forekomst af typen, den .klasse syntaks er vejen at gå.

6. Konklusion

I denne artikel lærte vi to forskellige måder at få Klasse objekt af en type: object.getClass () metode og .klasse syntaks.

Senere diskuterede vi forskellen mellem de to tilgange. Følgende tabel kan give os et klart overblik:

object.getClass ()SomeClass.class
KlasseobjekterRuntime-typen af objektDen statiske type SomeClass
Primitive typerArbejder ligetil
Grænseflader, abstrakte klasser eller klasser, der ikke kan instantieresArbejder ligetil

Som altid er artiklens fulde kildekode tilgængelig på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found