logo

Java Reflection API

Java-refleksjon er en prosess for å undersøke eller endre kjøretidsatferden til en klasse under kjøretiden .

De java.lang.Klasse klasse gir mange metoder som kan brukes til å hente metadata, undersøke og endre kjøretidsatferden til en klasse.

Pakkene java.lang og java.lang.reflect gir klasser for java-refleksjon.

Hvor den brukes

Reflection API brukes hovedsakelig i:

  • IDE (Integrated Development Environment) f.eks. Eclipse, MyEclipse, NetBeans etc.
  • Debugger
  • Testverktøy etc.
Vet du?
  • Hvor mange måter kan vi få forekomsten av klasseklassen?
  • Hvordan lage javap-verktøyet?
  • Hvordan lage appletviewer-verktøyet?
  • Hvordan få tilgang til den private metoden fra utenfor klassen?

java.lang.Klasse klasse

Java.lang.Class-klassen utfører hovedsakelig to oppgaver:

  • gir metoder for å få metadata til en klasse under kjøring.
  • gir metoder for å undersøke og endre kjøretidsatferden til en klasse.

Vanlige metoder i klasseklassen:

MetodeBeskrivelse
1) offentlig streng getName()returnerer klassenavnet
2) offentlig statisk Class forName(String className) kaster ClassNotFoundExceptionlaster klassen og returnerer referansen til klasseklassen.
3) offentlig objekt newInstance() kaster InstantiationException,IllegalAccessExceptionoppretter ny instans.
4) offentlig boolsk isInterface()sjekker om det er grensesnitt.
5) offentlig boolsk isArray ();sjekker om det er array.
6) offentlig boolsk isPrimitive()sjekker om den er primitiv.
7) offentlig klasse getSuperclass()returnerer superklassens klassereferanse.
8) offentlig felt[] getDeclaredFields() kaster SecurityExceptionreturnerer det totale antallet felt i denne klassen.
9) offentlig metode[] getDeclaredMethods() kaster SecurityExceptionreturnerer det totale antallet metoder for denne klassen.
10) offentlig Konstruktør[] getDeclaredConstructors() kaster SecurityExceptionreturnerer det totale antallet konstruktører av denne klassen.
11) offentlig metode getDeclaredMethod(String name,Class[] parameterTypes)throws NoSuchMethodException,SecurityExceptionreturnerer metodeklassen-forekomsten.

Hvordan få tak i objektet i klasseklassen?

Det er 3 måter å få forekomsten av klasseklassen på. De er som følger:

  • forName()-metoden til klasseklassen
  • getClass()-metoden til objektklassen
  • .class-syntaksen

1) forName()-metoden for klasseklassen

  • brukes til å laste klassen dynamisk.
  • returnerer forekomsten av klasseklassen.
  • Det bør brukes hvis du kjenner det fullt kvalifiserte navnet på klassen. Dette kan ikke brukes for primitive typer.

La oss se det enkle eksemplet på forName()-metoden.

Filnavn: Test.java

 class Simple{} public class Test{ public static void main(String args[]) throws Exception { Class c=Class.forName('Simple'); System.out.println(c.getName()); } } 

Produksjon:

nummer til streng java
 Simple 

2) getClass()-metoden for objektklassen

Den returnerer forekomsten av klasseklassen. Den bør brukes hvis du kjenner typen. Dessuten kan den brukes med primitiver.

Filnavn: Test.java

 class Simple{} class Test{ void printName(Object obj){ Class c=obj.getClass(); System.out.println(c.getName()); } public static void main(String args[]){ Simple s=new Simple(); Test t=new Test(); t.printName(s); } } 

Produksjon:

Simple 

3) .class-syntaksen

Hvis en type er tilgjengelig, men det er ingen forekomst, er det mulig å få en klasse ved å legge til '.class' til navnet på typen. Den kan også brukes til primitive datatyper.

Filnavn: Test.java

 class Test{ public static void main(String args[]){ Class c = boolean.class; System.out.println(c.getName()); Class c2 = Test.class; System.out.println(c2.getName()); } } 

Produksjon:

 boolean Test 

Bestemme klasseobjektet

Følgende metoder for klasseklassen brukes til å bestemme klasseobjektet:

1) offentlig boolsk ergrensesnitt(): bestemmer om det angitte klasseobjektet representerer en grensesnitttype.

2) offentlig boolsk isArray(): bestemmer om dette klasseobjektet representerer en matriseklasse.

3) offentlig boolsk isPrimitive(): bestemmer om det angitte klasseobjektet representerer en primitiv type.

La oss se det enkle eksemplet på refleksjons-API for å bestemme objekttypen.

Filnavn: Test.java

 class Simple{} interface My{} class Test{ public static void main(String args[]){ try{ Class c=Class.forName('Simple'); System.out.println(c.isInterface()); Class c2=Class.forName('My'); System.out.println(c2.isInterface()); }catch(Exception e){System.out.println(e);} } } 

Produksjon:

 false true 

Fordeler og ulemper med refleksjon

Java-refleksjon bør alltid brukes med forsiktighet. Selv om refleksjonen gir mange fordeler, har den også noen ulemper. La oss diskutere fordelene først.

Fordeler: Inspeksjon av grensesnitt, klasser, metoder og felt under kjøring er mulig ved å bruke refleksjon, selv uten å bruke navnene deres under kompileringstiden. Det er også mulig å kalle metoder, instansiere en klar eller sette verdien på felt ved hjelp av refleksjon. Det hjelper med å lage visuelle utviklingsmiljøer og klassenettlesere som gir utviklerne hjelp til å skrive riktig kode.

Ulemper: Ved hjelp av refleksjon kan man bryte prinsippene for innkapsling. Det er mulig å få tilgang til de private metodene og feltene til en klasse ved å bruke refleksjon. Dermed kan refleksjon lekke viktige data til omverdenen, noe som er farlig. For eksempel, hvis man får tilgang til de private medlemmene av en klasse og setter nullverdi til den, kan den andre brukeren av samme klasse få NullReferenceException, og denne oppførselen forventes ikke.

En annen ulempe er overhead i ytelse. Siden typene i refleksjon løses dynamisk, kan JVM (Java Virtual Machine)-optimalisering ikke finne sted. Derfor er operasjonene som utføres av refleksjoner vanligvis sakte.

år datamaskinen ble oppfunnet

Konklusjon

På grunn av de ovennevnte ulempene, er det generelt tilrådelig å unngå å bruke refleksjon. Det er en avansert funksjon som kun skal brukes av programmerere eller utviklere som har god kunnskap om det grunnleggende i språket. Alltid husk! Når refleksjon brukes, er sikkerheten til applikasjonen kompromittert.


Neste emner for Reflection API Tutorial

newInstance()-metoden
Forstå javap-verktøyet
lage javap-verktøy
lage appletviewer-verktøy
Ring privat metode fra en annen klasse