logo

Java Reflection API

Java refleksion er en proces med at undersøge eller ændre kørselstidsadfærden for en klasse på kørselstidspunktet .

Det java.lang.Class klasse giver mange metoder, der kan bruges til at få metadata, undersøge og ændre køretidsadfærden for en klasse.

Pakkerne java.lang og java.lang.reflect giver klasser til java-refleksion.

Hvor det bruges

Reflection API bruges hovedsageligt i:

  • IDE (Integrated Development Environment) f.eks. Eclipse, MyEclipse, NetBeans osv.
  • Debugger
  • Testværktøj mv.
Ved du?
  • På hvor mange måder kan vi få forekomsten af ​​klasseklassen?
  • Hvordan opretter man javap-værktøjet?
  • Hvordan opretter man appletviewer-værktøjet?
  • Hvordan får man adgang til den private metode uden for klassen?

java.lang.Klasse klasse

Java.lang.Class-klassen udfører hovedsageligt to opgaver:

  • giver metoder til at få metadata for en klasse under kørsel.
  • giver metoder til at undersøge og ændre en klasses køretidsadfærd.

Almindeligt anvendte metoder i klasseklassen:

MetodeBeskrivelse
1) offentlig streng getName()returnerer klassens navn
2) offentlig statisk klasse fornavn(streng klassenavn) kaster ClassNotFoundExceptionindlæser klassen og returnerer referencen til klasseklassen.
3) public Object newInstance() kaster InstantiationException,IllegalAccessExceptionopretter en ny instans.
4) offentlig boolesk isInterface()tjekker om det er interface.
5) public boolean isArray();tjekker om det er array.
6) offentlig boolesk erPrimitiv()tjekker om det er primitivt.
7) offentlig klasse getSuperclass()returnerer superklassens klassereference.
8) offentlig felt[] getDeclaredFields() kaster SecurityExceptionreturnerer det samlede antal felter i denne klasse.
9) offentlig metode[] getDeclaredMethods() kaster SecurityExceptionreturnerer det samlede antal metoder i denne klasse.
10) public Constructor[] getDeclaredConstructors() kaster SecurityExceptionreturnerer det samlede antal konstruktører af denne klasse.
11) offentlig metode getDeclaredMethod(String name,Class[] parameterTypes)throws NoSuchMethodException,SecurityExceptionreturnerer metodeklassens instans.

Hvordan får man genstanden i klasseklassen?

Der er 3 måder at få forekomsten af ​​klasseklassen på. De er som følger:

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

1) forName()-metoden i klasseklassen

  • bruges til at indlæse klassen dynamisk.
  • returnerer forekomsten af ​​klasseklassen.
  • Det bør bruges, hvis du kender det fuldt kvalificerede navn på klassen. Dette kan ikke bruges til primitive typer.

Lad os se det enkle eksempel på metoden forName().

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()); } } 

Produktion:

int til streng i java
 Simple 

2) getClass()-metoden for objektklassen

Det returnerer forekomsten af ​​klasseklassen. Den skal bruges, hvis du kender typen. Desuden kan den bruges 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); } } 

Produktion:

Simple 

3) .klasse-syntaksen

Hvis en type er tilgængelig, men der ikke er nogen instans, så er det muligt at få en klasse ved at tilføje '.class' til navnet på typen. Det kan også bruges 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()); } } 

Produktion:

 boolean Test 

Bestemmelse af klasseobjektet

Følgende metoder i klasseklassen bruges til at bestemme klasseobjektet:

1) offentlig boolesk isInterface(): bestemmer, om det angivne klasseobjekt repræsenterer en grænsefladetype.

2) offentlig boolesk isArray(): bestemmer, om dette klasseobjekt repræsenterer en array-klasse.

3) offentlig boolesk erPrimitiv(): bestemmer, om det angivne klasseobjekt repræsenterer en primitiv type.

Lad os se det enkle eksempel på refleksions-API for at 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);} } } 

Produktion:

 false true 

Fordele og ulemper ved refleksion

Java-refleksion skal altid bruges med forsigtighed. Selvom refleksionen giver en masse fordele, har den også nogle ulemper. Lad os først diskutere fordelene.

Fordele: Inspektion af grænseflader, klasser, metoder og felter under kørsel er muligt ved hjælp af refleksion, selv uden at bruge deres navne i kompileringstiden. Det er også muligt at kalde metoder, instansiere en clear eller at indstille værdien af ​​felter ved hjælp af refleksion. Det hjælper med at skabe visuelle udviklingsmiljøer og klassebrowsere, som giver udviklerne hjælp til at skrive den korrekte kode.

Ulemper: Ved hjælp af refleksion kan man bryde principperne for indkapsling. Det er muligt at få adgang til de private metoder og felter i en klasse ved hjælp af refleksion. Refleksion kan således lække vigtige data til omverdenen, hvilket er farligt. For eksempel, hvis man får adgang til de private medlemmer af en klasse og indstiller null-værdi til den, så kan den anden bruger af den samme klasse få NullReferenceException, og denne adfærd forventes ikke.

En anden ulempe er overhead i ydeevne. Da typerne i refleksion løses dynamisk, kan JVM (Java Virtual Machine) optimering ikke finde sted. Derfor er de operationer, der udføres af refleksioner, normalt langsomme.

: i java

Konklusion

På grund af de ovennævnte ulemper er det generelt tilrådeligt at undgå at bruge refleksion. Det er en avanceret funktion, som kun bør bruges af programmører eller udviklere, som har et godt kendskab til sprogets grundlæggende. Husk altid! Når der bruges refleksion, kompromitteres applikationens sikkerhed.


Næste emner i Reflection API Tutorial

newInstance() metode
Forstå javap værktøj
skabe javap-værktøj
oprettelse af appletviewer-værktøj
Kald privat metode fra en anden klasse