logo

Java Reflection API

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.
Ali veš?
  • 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:

MetodaOpis
1) javni niz getName()vrne ime razreda
2) javni statični razred forName(String className) vrže ClassNotFoundExceptionnaloži razred in vrne referenco razreda razreda.
3) javni objekt newInstance() vrže InstantiationException, IllegalAccessExceptionustvari 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 SecurityExceptionvrne skupno število polj tega razreda.
9) javna metoda [] getDeclaredMethods() vrže SecurityExceptionvrne skupno število metod tega razreda.
10) public Constructor[] getDeclaredConstructors() vrže SecurityExceptionvrne skupno število konstruktorjev tega razreda.
11) javna metoda getDeclaredMethod(String name,Class[] parameterTypes) vrže NoSuchMethodException,SecurityExceptionvrne 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