Reflecție Java este o proces de examinare sau modificare a comportamentului de rulare al unei clase în timpul de rulare .
The java.lang.Class clasa oferă multe metode care pot fi folosite pentru a obține metadate, a examina și a modifica comportamentul de rulare al unei clase.
Pachetele java.lang și java.lang.reflect oferă clase pentru reflectarea java.
Unde este folosit
API-ul Reflection este utilizat în principal în:
- IDE (Mediu de dezvoltare integrat), de exemplu, Eclipse, MyEclipse, NetBeans etc.
- Depanator
- Instrumente de testare etc.
- Câte moduri putem obține instanța clasei Class?
- Cum se creează instrumentul javap?
- Cum se creează instrumentul appletviewer?
- Cum se accesează metoda privată din afara clasei?
Clasa java.lang.Class
Clasa java.lang.Class îndeplinește în principal două sarcini:
- oferă metode pentru a obține metadatele unei clase în timpul rulării.
- oferă metode de examinare și modificare a comportamentului de rulare al unei clase.
Metode utilizate în mod obișnuit din clasa Class:
Metodă | Descriere |
---|---|
1) șir public getName() | returnează numele clasei |
2) Clasa publică statică forName(String className) aruncă ClassNotFoundException | încarcă clasa și returnează referința clasei Class. |
3) public Object newInstance() aruncă InstantiationException, IllegalAccessException | creează o nouă instanță. |
4) boolean public isInterface() | verifică dacă este interfață. |
5) public boolean isArray (); | verifică dacă este o matrice. |
6) boolean public isPrimitive() | verifică dacă este primitiv. |
7) clasă publică getSuperclass() | returnează referința clasei superclase. |
8) public Field[] getDeclaredFields() aruncă SecurityException | returnează numărul total de câmpuri din această clasă. |
9) Public Method[] getDeclaredMethods() aruncă SecurityException | returnează numărul total de metode din această clasă. |
10) Public Constructor[] getDeclaredConstructors() aruncă SecurityException | returnează numărul total de constructori ai acestei clase. |
11) Metoda publică getDeclaredMethod(Nume șir,Class[] parameterTypes) aruncă NoSuchMethodException,SecurityException | returnează instanța clasei metodei. |
Cum să obțineți obiectul clasei Class?
Există 3 moduri de a obține instanța clasei Class. Acestea sunt după cum urmează:
- metoda forName() a clasei Class
- metoda getClass() a clasei Object
- sintaxa .clasei
1) metoda forName() a clasei Class
- este folosit pentru a încărca clasa dinamic.
- returnează instanța clasei Class.
- Ar trebui folosit dacă cunoașteți numele complet calificat al clasei. Acesta nu poate fi folosit pentru tipurile primitive.
Să vedem exemplul simplu al metodei forName().
Nume de fișier: 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()); } }
Ieșire:
Simple
2) metoda getClass() a clasei Object
Returnează instanța clasei Class. Ar trebui folosit dacă cunoașteți tipul. Mai mult, poate fi folosit cu primitive.
Nume de fișier: 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); } }
Ieșire:
Simple
3) Sintaxa .class
Dacă un tip este disponibil, dar nu există nicio instanță, atunci este posibil să obțineți o clasă prin adăugarea „.class” la numele tipului. Poate fi folosit și pentru tipurile de date primitive.
declarație de caz java
Nume de fișier: 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()); } }
Ieșire:
boolean Test
Determinarea obiectului clasei
Următoarele metode ale clasei Class sunt utilizate pentru a determina obiectul clasei:
1) boolean public isInterface(): determină dacă obiectul Class specificat reprezintă un tip de interfață.
2) boolean public isArray(): determină dacă acest obiect Class reprezintă o clasă matrice.
3) boolean public isPrimitive(): determină dacă obiectul Class specificat reprezintă un tip primitiv.
Să vedem exemplul simplu de API reflection pentru a determina tipul obiectului.
Nume de fișier: 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);} } }
Ieșire:
false true
Avantaje și dezavantaje ale reflecției
Reflexia Java trebuie folosită întotdeauna cu prudență. În timp ce reflexia oferă o mulțime de avantaje, are și unele dezavantaje. Să discutăm mai întâi despre avantaje.
Pro: Inspecția interfețelor, claselor, metodelor și câmpurilor în timpul rulării este posibilă folosind reflectarea, chiar și fără a folosi numele acestora în timpul compilării. De asemenea, este posibil să apelați metode, să instanțiați un clear sau să setați valoarea câmpurilor folosind reflectarea. Ajută la crearea mediilor de dezvoltare vizuală și a browserelor de clasă care oferă ajutor dezvoltatorilor pentru a scrie codul corect.
Contra: Folosind reflecția, se pot încălca principiile încapsulării. Este posibil să accesați metodele și câmpurile private ale unei clase utilizând reflection. Astfel, reflecția poate scurge date importante către lumea exterioară, ceea ce este periculos. De exemplu, dacă unul accesează membrii privați ai unei clase și îi setează o valoare nulă, atunci celălalt utilizator din aceeași clasă poate obține NullReferenceException și acest comportament nu este așteptat.
Un alt demerit este costul general al performanței. Deoarece tipurile în reflectare sunt rezolvate dinamic, optimizarea JVM (Java Virtual Machine) nu poate avea loc. Prin urmare, operațiunile efectuate prin reflexii sunt de obicei lente.
Concluzie
Din cauza dezavantajelor menționate mai sus, este, în general, recomandabil să evitați utilizarea reflexiei. Este o caracteristică avansată care ar trebui folosită numai de programatori sau dezvoltatori care au cunoștințe bune despre elementele de bază ale limbajului. Amintiți-vă mereu! Ori de câte ori este utilizată reflectarea, securitatea aplicației este compromisă.
Următoarele subiecte ale Tutorialului Reflection API
metoda newInstance().Înțelegerea instrumentului javap
crearea instrumentului javap
crearea instrumentului appletviewer
Apelați metoda privată dintr-o altă clasă