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.
- 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:
Metode | Beskrivelse |
---|---|
1) offentlig streng getName() | returnerer klassens navn |
2) offentlig statisk klasse fornavn(streng klassenavn) kaster ClassNotFoundException | indlæser klassen og returnerer referencen til klasseklassen. |
3) public Object newInstance() kaster InstantiationException,IllegalAccessException | opretter 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 SecurityException | returnerer det samlede antal felter i denne klasse. |
9) offentlig metode[] getDeclaredMethods() kaster SecurityException | returnerer det samlede antal metoder i denne klasse. |
10) public Constructor[] getDeclaredConstructors() kaster SecurityException | returnerer det samlede antal konstruktører af denne klasse. |
11) offentlig metode getDeclaredMethod(String name,Class[] parameterTypes)throws NoSuchMethodException,SecurityException | returnerer 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() metodeForstå javap værktøj
skabe javap-værktøj
oprettelse af appletviewer-værktøj
Kald privat metode fra en anden klasse