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.
- 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:
Metode | Beskrivelse |
---|---|
1) offentlig streng getName() | returnerer klassenavnet |
2) offentlig statisk Class forName(String className) kaster ClassNotFoundException | laster klassen og returnerer referansen til klasseklassen. |
3) offentlig objekt newInstance() kaster InstantiationException,IllegalAccessException | oppretter 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 SecurityException | returnerer det totale antallet felt i denne klassen. |
9) offentlig metode[] getDeclaredMethods() kaster SecurityException | returnerer det totale antallet metoder for denne klassen. |
10) offentlig Konstruktør[] getDeclaredConstructors() kaster SecurityException | returnerer det totale antallet konstruktører av denne klassen. |
11) offentlig metode getDeclaredMethod(String name,Class[] parameterTypes)throws NoSuchMethodException,SecurityException | returnerer 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()-metodenForstå javap-verktøyet
lage javap-verktøy
lage appletviewer-verktøy
Ring privat metode fra en annen klasse