Java Reflection je proces ispitivanja ili modificiranja ponašanja klase u vremenu izvođenja .
The java.lang.Class klasa pruža mnoge metode koje se mogu koristiti za dobivanje metapodataka, ispitivanje i promjenu ponašanja klase u vremenu izvođenja.
Paketi java.lang i java.lang.reflect pružaju klase za java refleksiju.
Gdje se koristi
Reflection API se uglavnom koristi u:
- IDE (integrirano razvojno okruženje) npr. Eclipse, MyEclipse, NetBeans itd.
- Debugger
- Alati za testiranje itd.
- Na koliko načina možemo dobiti instancu klase Class?
- Kako napraviti javap alat?
- Kako stvoriti alat appletviewer?
- Kako pristupiti privatnoj metodi izvan klase?
java.lang.Class class
Klasa java.lang.Class obavlja uglavnom dva zadatka:
polje java
- pruža metode za dobivanje metapodataka klase tijekom izvođenja.
- pruža metode za ispitivanje i promjenu ponašanja klase u vremenu izvođenja.
Često korištene metode klase Class:
metoda | Opis |
---|---|
1) javni niz getName() | vraća ime klase |
2) public static Class forName(String className) izbacuje ClassNotFoundException | učitava klasu i vraća referencu klase klase. |
3) javni objekt newInstance() izbacuje InstantiationException, IllegalAccessException | stvara novu instancu. |
4) javno booleovo isInterface() | provjerava je li sučelje. |
5) javni booleov isArray(); | provjerava da li je niz. |
6) javni booleov isPrimitive() | provjerava je li primitivan. |
7) javna klasa getSuperclass() | vraća referencu klase superklase. |
8) public Field[] getDeclaredFields() izbacuje SecurityException | vraća ukupan broj polja ove klase. |
9) javna metoda[] getDeclaredMethods() izbacuje SecurityException | vraća ukupan broj metoda ove klase. |
10) public Constructor[] getDeclaredConstructors() izbacuje SecurityException | vraća ukupan broj konstruktora ove klase. |
11) javna metoda getDeclaredMethod(Naziv niza,Class[] parameterTypes) izbacuje NoSuchMethodException,SecurityException | vraća instancu klase metode. |
Kako dobiti objekt klase Class?
Postoje 3 načina za dobivanje instance klase Class. Oni su sljedeći:
- forName() metoda klase Class
- getClass() metoda klase Object
- sintaksa .class
1) forName() metoda klase Class
- koristi se za dinamičko učitavanje klase.
- vraća instancu klase Class.
- Trebalo bi ga koristiti ako znate potpuno kvalificirano ime klase. Ovo se ne može koristiti za primitivne tipove.
Pogledajmo jednostavan primjer metode forName().
Naziv datoteke: Test.java
string.compare c#
class Simple{} public class Test{ public static void main(String args[]) throws Exception { Class c=Class.forName('Simple'); System.out.println(c.getName()); } }
Izlaz:
Simple
2) metoda getClass() klase Object
Vraća instancu klase klase. Trebalo bi ga koristiti ako znate vrstu. Štoviše, može se koristiti s primitivima.
Naziv 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); } }
Izlaz:
Simple
3) Sintaksa .class
Ako je tip dostupan, ali ne postoji instanca, tada je moguće dobiti klasu dodavanjem '.class' imenu tipa. Može se koristiti i za primitivne tipove podataka.
Naziv datoteke: Test.java
java niz za popis
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()); } }
Izlaz:
boolean Test
Određivanje objekta klase
Za određivanje objekta klase koriste se sljedeće metode klase klase:
1) javno booleovo isInterface(): određuje da li navedeni objekt klase predstavlja tip sučelja.
2) javni booleov isArray(): određuje da li ovaj Class objekt predstavlja klasu polja.
amrita rao glumica
3) javni booleov isPrimitive(): određuje predstavlja li navedeni objekt klase primitivni tip.
Pogledajmo jednostavan primjer API-ja refleksije za određivanje vrste objekta.
Naziv 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);} } }
Izlaz:
okretanje niza u Javi
false true
Za i protiv odraza
Java refleksiju treba uvijek koristiti s oprezom. Iako refleksija pruža puno prednosti, ima i neke nedostatke. Prvo raspravimo o prednostima.
Prednosti: Inspekcija sučelja, klasa, metoda i polja tijekom vremena izvođenja moguća je korištenjem refleksije, čak i bez korištenja njihovih imena tijekom vremena kompajliranja. Također je moguće pozvati metode, instancirati clear ili postaviti vrijednost polja pomoću refleksije. Pomaže u stvaranju vizualnih razvojnih okruženja i preglednika klasa koji programerima pomažu u pisanju ispravnog koda.
Protiv: Koristeći refleksiju, može se razbiti princip enkapsulacije. Moguće je pristupiti privatnim metodama i poljima klase pomoću refleksije. Dakle, refleksija može procuriti važne podatke u vanjski svijet, što je opasno. Na primjer, ako netko pristupi privatnim članovima klase i postavi mu vrijednost null, tada drugi korisnik iste klase može dobiti NullReferenceException, a takvo se ponašanje ne očekuje.
Drugi nedostatak je režijski trošak u izvedbi. Budući da se tipovi u refleksiji rješavaju dinamički, JVM (Java Virtual Machine) optimizacija se ne može dogoditi. Stoga su operacije koje izvode refleksije obično spore.
Zaključak
Zbog gore navedenih nedostataka općenito se preporučuje izbjegavati korištenje refleksije. To je napredna značajka koju bi trebali koristiti samo programeri ili programeri koji dobro poznaju osnove jezika. Uvijek pamtiti! Kad god se koristi odraz, sigurnost aplikacije je ugrožena.
Sljedeći vodič za API za teme refleksije
metoda newInstance().Razumijevanje javap alata
stvaranje javap alata
kreiranje alata appletviewer
Pozovite privatnu metodu iz druge klase