Java Reflection je proces preučevanja ali spreminjanja obnašanja razreda v času izvajanja .
The java.lang.Class ponuja veliko metod, ki jih je mogoče uporabiti za pridobivanje metapodatkov, pregledovanje in spreminjanje obnašanja razreda v času izvajanja.
Paketa java.lang in java.lang.reflect zagotavljata razrede za refleksijo java.
Kjer se uporablja
Reflection API se uporablja predvsem v:
- IDE (Integrirano razvojno okolje), npr. Eclipse, MyEclipse, NetBeans itd.
- Odpravljalnik napak
- Testna orodja itd.
- Na koliko načinov lahko dobimo primerek razreda Class?
- Kako ustvariti orodje javap?
- Kako ustvariti orodje appletviewer?
- Kako dostopati do zasebne metode zunaj razreda?
java.lang.Razred razred
Razred java.lang.Class opravlja predvsem dve nalogi:
oblikovanje niza java
- zagotavlja metode za pridobivanje metapodatkov razreda med izvajanjem.
- ponuja metode za pregledovanje in spreminjanje obnašanja razreda v času izvajanja.
Pogosto uporabljene metode razreda razreda:
Metoda | Opis |
---|---|
1) javni niz getName() | vrne ime razreda |
2) javni statični razred forName(String className) vrže ClassNotFoundException | naloži razred in vrne referenco razreda razreda. |
3) javni objekt newInstance() vrže InstantiationException, IllegalAccessException | ustvari nov primerek. |
4) javni logični isInterface() | preveri, ali je vmesnik. |
5) javni logični isArray (); | preveri, ali je niz. |
6) javna logična vrednost isPrimitive() | preveri, ali je primitiven. |
7) javni razred getSuperclass() | vrne referenco razreda nadrazreda. |
8) public Field[] getDeclaredFields() vrže SecurityException | vrne skupno število polj tega razreda. |
9) javna metoda [] getDeclaredMethods() vrže SecurityException | vrne skupno število metod tega razreda. |
10) public Constructor[] getDeclaredConstructors() vrže SecurityException | vrne skupno število konstruktorjev tega razreda. |
11) javna metoda getDeclaredMethod(String name,Class[] parameterTypes) vrže NoSuchMethodException,SecurityException | vrne primerek razreda metode. |
Kako pridobiti objekt razreda Class?
Primerek razreda Class lahko dobite na 3 načine. So naslednji:
- forName() metoda razreda Class
- metoda getClass() razreda Object
- sintakso .class
1) metoda forName() razreda razreda
- se uporablja za dinamično nalaganje razreda.
- vrne primerek razreda razreda.
- Uporabite ga, če poznate popolnoma kvalificirano ime razreda. Tega ni mogoče uporabiti za primitivne tipe.
Oglejmo si preprost primer metode forName().
Ime datoteke: Test.java
vaja programskega jezika java
class Simple{} public class Test{ public static void main(String args[]) throws Exception { Class c=Class.forName('Simple'); System.out.println(c.getName()); } }
Izhod:
Simple
2) metoda getClass() razreda Object
Vrne primerek razreda razreda. Uporabite ga, če poznate vrsto. Poleg tega se lahko uporablja s primitivnimi elementi.
Ime datoteke: 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); } }
Izhod:
Simple
3) Sintaksa .class
Če je tip na voljo, vendar ni primerka, je mogoče pridobiti razred tako, da imenu tipa dodate '.class'. Uporablja se lahko tudi za primitivne vrste podatkov.
Ime datoteke: Test.java
nizov v cela števila
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()); } }
Izhod:
boolean Test
Določanje predmeta razreda
Za določitev predmeta razreda se uporabljajo naslednje metode razreda razreda:
1) javni logični isInterface(): določa, ali podani objekt razreda predstavlja tip vmesnika.
2) javni logični isArray (); določa, ali ta objekt razreda predstavlja razred matrike.
3) javna logična vrednost isPrimitive(): določa, ali podani objekt razreda predstavlja primitivni tip.
Oglejmo si preprost primer API-ja refleksije za določitev vrste predmeta.
java pretvori niz v int
Ime datoteke: 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);} } }
Izhod:
c# slovar
false true
Prednosti in slabosti refleksije
Java refleksijo je treba vedno uporabljati previdno. Čeprav ima refleksija veliko prednosti, ima tudi nekaj slabosti. Najprej se pogovorimo o prednostih.
Prednosti: Pregled vmesnikov, razredov, metod in polj med izvajanjem je možen z uporabo refleksije, tudi brez uporabe njihovih imen med časom prevajanja. Možno je tudi klicati metode, instancirati klir ali nastaviti vrednost polj z odsevom. Pomaga pri ustvarjanju vizualnih razvojnih okolij in brskalnikov razredov, ki nudijo pomoč razvijalcem pri pisanju pravilne kode.
Slabosti: Z refleksijo lahko prekinemo načela inkapsulacije. Z refleksijo je mogoče dostopati do zasebnih metod in polj razreda. Tako lahko refleksija uhaja pomembne podatke v zunanji svet, kar je nevarno. Na primer, če nekdo dostopa do zasebnih članov razreda in mu nastavi ničelno vrednost, lahko drugi uporabnik istega razreda dobi izjemo NullReferenceException in to vedenje ni pričakovano.
Druga pomanjkljivost so stroški delovanja. Ker se vrste v refleksiji razrešijo dinamično, optimizacija JVM (Java Virtual Machine) ne more potekati. Zato so operacije, ki jih izvajajo refleksije, običajno počasne.
Zaključek
Zaradi zgoraj omenjenih slabosti se je na splošno priporočljivo izogibati uporabi refleksije. To je napredna funkcija, ki naj jo uporabljajo samo programerji ali razvijalci, ki dobro poznajo osnove jezika. Vedno si zapomni! Kadarkoli se uporabi refleksija, je varnost aplikacije ogrožena.
Naslednja vadnica API-ja Topics of Reflection
metoda newInstance().Razumevanje orodja javap
ustvarjanje orodja javap
ustvarjanje orodja appletviewer
Pokličite zasebno metodo iz drugega razreda