logo

Java Reflection API

Java Reflection je a proces skúmania alebo úpravy správania triedy v čase behu v čase behu .

úplná pravdivostná tabuľka sčítačky

The java.lang.Class poskytuje mnoho metód, ktoré možno použiť na získanie metaúdajov, preskúmanie a zmenu správania triedy v čase spustenia.

Balíky java.lang a java.lang.reflect poskytujú triedy pre reflexiu java.

Kde sa používa

Reflection API sa používa hlavne v:

  • IDE (Integrated Development Environment), napr. Eclipse, MyEclipse, NetBeans atď.
  • Debugger
  • Testovacie nástroje atď.
Vieš?
  • Koľkými spôsobmi môžeme získať inštanciu triedy Class?
  • Ako vytvoriť nástroj javap?
  • Ako vytvoriť nástroj na zobrazovanie apletov?
  • Ako získať prístup k súkromnej metóde mimo triedy?

trieda java.lang.Class

Trieda java.lang.Class plní hlavne dve úlohy:

  • poskytuje metódy na získanie metadát triedy za behu.
  • poskytuje metódy na preskúmanie a zmenu správania triedy pri behu.

Bežne používané metódy triedy Class:

MetódaPopis
1) verejný reťazec getName()vráti názov triedy
2) public static Class forName(String className) vyvolá výnimku ClassNotFoundExceptionnačíta triedu a vráti referenciu triedy Class.
3) verejný objekt newInstance() vyvolá výnimku InstantiationException,IllegalAccessExceptionvytvorí novú inštanciu.
4) verejný boolovský isInterface()skontroluje, či ide o rozhranie.
5) public boolean isArray();skontroluje, či je to pole.
6) public boolean isPrimitive()skontroluje, či je primitívny.
7) verejná trieda getSuperclass()vráti odkaz na triedu nadtriedy.
8) verejné pole[] getDeclaredFields() vyvolá výnimku zabezpečeniavráti celkový počet polí tejto triedy.
9) verejná metóda[] getDeclaredMethods() vyvolá výnimku zabezpečeniavráti celkový počet metód tejto triedy.
10) verejný konštruktor[] getDeclaredConstructors() vyvolá výnimku zabezpečeniavráti celkový počet konštruktorov tejto triedy.
11) verejná metóda getDeclaredMethod(názov reťazca,Typy parametrov triedy[]) vyvolá výnimku NoSuchMethodException,SecurityExceptionvráti inštanciu triedy metódy.

Ako získať objekt triedy Class?

Existujú 3 spôsoby, ako získať inštanciu triedy Class. Sú nasledovné:

  • metóda forName() triedy Class
  • getClass() metóda triedy Object
  • syntax .class

1) metóda forName() triedy Class

  • sa používa na dynamické načítanie triedy.
  • vráti inštanciu triedy Class.
  • Mali by ste ho použiť, ak poznáte úplný názov triedy. Toto nemožno použiť pre primitívne typy.

Pozrime sa na jednoduchý príklad metódy forName().

Názov súboru: 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()); } } 

Výkon:

 Simple 

2) metóda getClass() triedy Object

Vráti inštanciu triedy Class. Mal by sa použiť, ak poznáte typ. Okrem toho sa dá použiť s primitívmi.

Názov súboru: 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); } } 

Výkon:

Simple 

3) Syntax .class

Ak je typ dostupný, ale neexistuje žiadna inštancia, potom je možné získať triedu pridaním '.class' k názvu typu. Dá sa použiť aj pre primitívne dátové typy.

Názov súboru: 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()); } } 

Výkon:

 boolean Test 

Určenie objektu triedy

Na určenie objektu triedy sa používajú nasledujúce metódy triedy Class:

1) verejný boolovský isInterface(): určuje, či zadaný objekt Class predstavuje typ rozhrania.

2) public boolean isArray(): určuje, či tento objekt Class predstavuje triedu poľa.

3) public boolean isPrimitive(): určuje, či zadaný objekt Class predstavuje primitívny typ.

Pozrime sa na jednoduchý príklad odrazového API na určenie typu objektu.

Názov súboru: 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);} } } 

Výkon:

 false true 

Výhody a nevýhody reflexie

Java reflexia by sa mala vždy používať opatrne. Zatiaľ čo odraz poskytuje veľa výhod, má aj niekoľko nevýhod. Najprv si pohovorme o výhodách.

Výhody: Kontrola rozhraní, tried, metód a polí počas behu je možná pomocou reflexie, a to aj bez použitia ich názvov počas kompilácie. Je tiež možné volať metódy, inštanciovať clear alebo nastaviť hodnotu polí pomocou odrazu. Pomáha pri vytváraní vizuálnych vývojových prostredí a triednych prehliadačov, ktoré vývojárom pomáhajú napísať správny kód.

Zápory: Pomocou odrazu možno porušiť princípy zapuzdrenia. K súkromným metódam a poliam triedy je možné pristupovať pomocou reflexie. Odrazom tak môžu uniknúť dôležité údaje do vonkajšieho sveta, čo je nebezpečné. Napríklad, ak jeden pristupuje k súkromným členom triedy a nastaví im hodnotu null, potom druhý používateľ tej istej triedy môže získať výnimku NullReferenceException a toto správanie sa neočakáva.

Ďalšou nevýhodou je réžia vo výkone. Keďže typy v odraze sa riešia dynamicky, optimalizácia JVM (Java Virtual Machine) nemôže prebehnúť. Preto sú operácie vykonávané odrazmi zvyčajne pomalé.

Záver

Vzhľadom na vyššie uvedené nevýhody sa vo všeobecnosti odporúča vyhnúť sa používaniu odrazu. Ide o pokročilú funkciu, ktorú by mali používať iba programátori alebo vývojári, ktorí dobre ovládajú základy jazyka. Vždy si pamätaj! Vždy, keď sa použije odraz, je ohrozená bezpečnosť aplikácie.


Ďalšie témy príručky Reflection API

metóda newInstance().
Pochopenie nástroja javap
vytvorenie nástroja javap
nástroj na vytváranie apletov
Zavolajte súkromnú metódu z inej triedy