java reflection tutorial with examples
Tento videonávod vysvetľuje, čo je reflexia a ako ju implementovať pomocou rozhrania Reflection API:
Reflect in Java is to inspect and change the behavior of a program at runtime.
Pomocou tohto reflexného rozhrania API môžete za behu kontrolovať triedy, konštruktory, modifikátory, polia, metódy a rozhrania. Napríklad, môžete získať názov triedy alebo podrobnosti o súkromných členoch triedy.
Prečítajte si celé Séria školení JAVA pre viac informácií o konceptoch Java.
Tu je videonávod o odraze Java:
Čo sa dozviete:
Odraz v Jave
Sme si vedomí, že v danej triede môžeme upraviť jej vlastnosti a metódy v čase kompilácie, a je to veľmi ľahké. Či už sú vlastnosti a metódy anonymné alebo majú názvy, môžu sa počas kompilácie meniť podľa ľubovôle.
Tieto triedy, metódy alebo polia však nemôžeme za behu meniť. Inými slovami, je veľmi ťažké zmeniť správanie rôznych programovacích komponentov za behu, najmä pre neznáme objekty.
Programovací jazyk Java poskytuje funkciu s názvom „Reflexia“ , ktorý nám umožňuje za behu upraviť behové správanie triedy alebo poľa alebo metódy.
Reflexiu teda môžeme definovať ako a „Technika kontroly a úpravy chovania neznámeho objektu za behu za behu. Objektom môže byť trieda, pole alebo metóda. “
Reflection je „Aplikačné programové rozhranie“ (API) poskytované spoločnosťou Java.
Proces „Reflexia“ je zobrazený nižšie.
Na vyššie uvedenom znázornení vidíme, že máme neznámy objekt. Potom na tomto objekte použijeme Reflection API. Vďaka tomu môžeme upraviť chovanie tohto objektu za behu programu.
Preto môžeme v našich programoch používať Reflection API na účely úpravy správania objektu. Objekty môžu byť čokoľvek, ako sú metódy, rozhrania, triedy atď. Tieto objekty skontrolujeme a potom zmeníme ich správanie za behu pomocou odrazového rozhrania API.
V Jave sú „java.lang“ a „java.lang.reflect“ dva balíky, ktoré poskytujú triedy na zamyslenie. Špeciálna trieda „java.lang.Class“ poskytuje metódy a vlastnosti na extrahovanie metadát, pomocou ktorých môžeme kontrolovať a upravovať správanie triedy.
Na úpravu triedy a jej členov vrátane polí, metód, konštruktorov atď. Za behu modulu používame Reflection API poskytované vyššie uvedenými balíkmi. Charakteristickým znakom Reflection API je, že môžeme manipulovať aj so súkromnými údajovými členmi alebo metódami triedy.
Reflection API sa používa hlavne v:
- Reflexia sa používa hlavne v ladiacich nástrojoch, JUnit a rámcoch na kontrolu a zmenu správania za behu programu.
- IDE (integrované vývojové prostredie) Napr. Eclipse IDE, NetBeans atď.
- Testovacie nástroje atď.
- Používa sa, keď má vaša aplikácia knižnice tretích strán a keď sa chcete dozvedieť viac o dostupných triedach a metódach.
Reflexné API v Jave
Pomocou Reflection API môžeme implementovať reflexiu na nasledujúce entity:
- Lúka : Trieda Field má informácie, ktoré používame na deklaráciu premennej alebo poľa ako dátový typ (int, double, String atď.), Modifikátor prístupu (súkromný, verejný, chránený atď.), Meno (identifikátor) a hodnota.
- Metóda : Trieda Method nám môže pomôcť extrahovať informácie ako modifikátor prístupu metódy, návratový typ metódy, názov metódy, typy parametrov metódy a typy výnimiek vyvolané metódou.
- Staviteľ : Trieda konštruktora poskytuje informácie o konštruktore triedy, ktorý obsahuje modifikátor prístupu konštruktora, názov konštruktora a typy parametrov.
- Upraviť : Trieda modifikátorov nám poskytuje informácie o konkrétnom modifikátore prístupu.
Všetky vyššie uvedené triedy sú súčasťou balíka java.lang.reflect. Ďalej budeme diskutovať o každej z týchto tried a pomocou príkladov programovania demonštrujeme reflexiu o týchto triedach.
Najprv začnime s triedou java.lang.Class.
trieda java.lang.Class
Java.lang. Trieda uchováva všetky informácie a údaje o triedach a objektoch za behu programu. Toto je hlavná trieda používaná na reflexiu.
Trieda java.lang.Class poskytuje:
- Metódy na získanie metadát triedy za behu.
- Metódy kontroly a úpravy správania triedy za behu.
Vytvorte objekty java.lang.Class
Objekty súboru java.lang.Class môžeme vytvárať pomocou jednej z nasledujúcich možností.
čo robiť so súbormi apk
# 1). Rozšírenie triedy
Prvá možnosť na vytvorenie objektu triedy je pomocou prípony .class.
Napríklad,ak je Test trieda, potom môžeme vytvoriť objekt triedy takto:
Class obj_test = Test.class;
Potom môžeme použiť obj_test na vykonanie reflexie, pretože tento objekt bude mať všetky informácie o triede Test.
# 2) metóda forName ()
Metóda forName () berie názov triedy ako argument a vracia objekt Class.
Napríklad,objekt triedy Test je možné vytvoriť nasledovne:
class obj_test = Class.forName (“Test”);
# 3) metóda getClas ()
Metóda getClass () používa objekt triedy na získanie objektu java.lang.Class.
Napríklad,zvážte nasledujúci kód:
Test obj = new Test (); Class obj_test = obj.getClass ();
V prvom riadku sme vytvorili objekt triedy Test. Potom pomocou tohto objektu sme nazvali metódu „getClass ()“, aby sme získali objekt obj_test z java.lang.Class.
Získajte Super Class a modifikátory prístupu
java.lang.class poskytuje metódu „getSuperClass ()“, ktorá sa používa na získanie nadtriedy akejkoľvek triedy.
Podobne poskytuje metódu getModifier (), ktorá vracia modifikátor prístupu triedy.
Nasledujúci príklad demonštruje metódu getSuperClass ().
import java.lang.Class; import java.lang.reflect.*; //define Person interface interface Person { public void display(); } //declare class Student that implements Person class Student implements Person { //define interface method display public void display() { System.out.println('I am a Student'); } } class Main { public static void main(String[] args) { try { // create an object of Student class Student s1 = new Student(); // get Class object using getClass() Class obj = s1.getClass(); // get the superclass of Student Class superClass = obj.getSuperclass(); System.out.println('Superclass of Student Class: ' + superClass.getName()); } catch(Exception e) { e.printStackTrace(); } } }
Výkon
Vo vyššie uvedenom príklade programovania je rozhranie Osoba definované samostatnou metódou „display ()“. Potom definujeme triedu Student implementujúcu rozhranie osoby. V hlavnej metóde používame metódu getClass () na získanie objektu Class a následný prístup k nadradenej alebo nadtriede objektu Student pomocou metódy getSuperClass ().
Získajte rozhrania
Ak trieda implementuje niektoré rozhrania, potom môžeme tieto názvy rozhraní získať pomocou metódy getInterfaces () metódy java.lang.Class. Za týmto účelom musíme vykonať reflexiu o triede Java.
Nasledujúci príklad programovania zobrazuje použitie metódy getInterfaces () v prostredí Java Reflection.
import java.lang.Class; import java.lang.reflect.*; //define Interface Animals and PetAnimals interface Animals { public void display(); } interface PetAnimals { public void makeSound(); } //define a class Dog that implements above interfaces class Dog implements Animals, PetAnimals { //define interface method display public void display() { System.out.println('This is a PetAnimal::Dog'); } //define interface method makeSound public void makeSound() { System.out.println('Dog makes sound::Bark bark'); } } class Main { public static void main(String[] args) { try { // create an object of Dog class Dog dog = new Dog(); // get class object Class obj = dog.getClass(); // get the interfaces implemented by Dog Class[] objInterface = obj.getInterfaces(); System.out.println('Class Dog implements following interfaces:'); //print all the interfaces implemented by class Dog for(Class citem : objInterface) { System.out.println('Interface Name: ' + citem.getName()); } } catch(Exception e) { e.printStackTrace(); } } }
Výkon
Vo vyššie uvedenom programe sme definovali dve rozhrania, tj. Zvieratá a Zvieratá. Potom definujeme triedu Dog, ktorá implementuje obe tieto rozhrania.
V hlavnej metóde načítame objekt triedy Dog v java.lang.Class, aby sme vykonali reflexiu. Potom pomocou metódy getInterfaces () načítame rozhrania, ktoré implementuje trieda Dog.
Odraz: Získajte hodnotu poľa
Ako už bolo spomenuté, balík java.lang.reflect poskytuje triedu Field, ktorá nám pomáha odrážať pole alebo dátových členov triedy.
Nižšie sú uvedené metódy poskytované triedou Field pre reflexiu poľa.
Metóda | Popis |
---|---|
getField ('poleName') | Vráti pole (verejné) so zadaným názvom poľa. |
getFields () | Vráti všetky verejné polia (pre triedu aj nadtriedu). |
getDeclaredFields () | Načíta všetky polia triedy. |
getModifier () | Vráti celočíselnú reprezentáciu modifikátora prístupu k poli. |
množina (classObject, value) | Priradí poľa zadanú hodnotu. |
get (classObject) | Načíta hodnotu poľa. |
setAccessible (boolean) | Sprístupnite súkromné pole zadaním true. |
getDeclaredField ('fieldName') | Vráti pole so zadaným názvom. |
Ďalej sú uvedené dva príklady reflexie, ktoré demonštrujú reflexiu vo verejnej a súkromnej oblasti.
Nižšie uvedený program Java demonštruje reflexiu na verejnom poli.
import java.lang.Class; import java.lang.reflect.*; class Student { public String StudentName; } class Main { public static void main(String[] args) { try{ Student student = new Student(); // get an object of the class Class Class obj = student.getClass(); // provide field name and get the field info Field student_field = obj.getField('StudentName'); System.out.println('Details of StudentName class field:'); // set the value of field student_field.set(student, 'Lacey'); // get the access modifier of StudentName int mod1 = student_field.getModifiers(); String modifier1 = Modifier.toString(mod1); System.out.println('StudentName Modifier::' + modifier1); // get the value of field by converting in String String typeValue = (String)student_field.get(student); System.out.println('StudentName Value::' + typeValue); } catch(Exception e) { e.printStackTrace(); } } }
Výkon
V tomto programe sme vyhlásili triedu „Študent“ s verejným poľom StudentName. Potom pomocou rozhrania API triedy Field vykonáme reflexiu na poli StudentName a načítame jeho modifikátor a hodnotu prístupu.
Nasledujúci program vykoná reflexiu na súkromnom poli triedy. Operácie sú podobné, až na to, že pre súkromné pole sa vykonáva jedno volanie funkcie navyše. Pre súkromné pole musíme zavolať setAccessible (true). Potom vykonáme reflexiu tohto poľa podobným spôsobom ako vo verejnom poli.
import java.lang.Class; import java.lang.reflect.*; class Student { private String rollNo; } class Main { public static void main(String[] args) { try { Student student = new Student(); // get the object for class Student in a Class. Class obj = student.getClass(); // access the private field Field field2 = obj.getDeclaredField('rollNo'); // make the private field accessible field2.setAccessible(true); // set the value of rollNo field2.set(student, '27'); System.out.println('Field Information of rollNo:'); // get the access modifier of rollNo int mod2 = field2.getModifiers(); String modifier2 = Modifier.toString(mod2); System.out.println('rollNo modifier::' + modifier2); // get the value of rollNo converting in String String rollNoValue = (String)field2.get(student); System.out.println('rollNo Value::' + rollNoValue); } catch(Exception e) { e.printStackTrace(); } } }
Výkon
Reflexia: Metóda
Podobne ako v poliach triedy, môžeme tiež vykonať reflexiu metód triedy a upraviť ich správanie za behu. K tomu používame triedu Method balíka java.lang.reflect.
Nižšie sú uvedené funkcie poskytované metódou Class for Reflection of the class method.
Metóda | Popis |
---|---|
getMethods () | Načíta všetky verejné metódy definované v triede a jej nadtriede. |
getDeclaredMethod () | Vráti metódy deklarované v triede. |
getName () | Vráti názvy metód. |
getModifiers () | Vráti celé číslo reprezentácie modifikátora prístupu metódy. |
getReturnType () | Vráti návratový typ metódy. |
Nasledujúci príklad ukazuje odraz metód triedy v Jave pomocou vyššie uvedených API.
import java.lang.Class; import java.lang.reflect.*; //declare a class Vehicle with four methods class Vehicle { public void display() { System.out.println('I am a Vehicle!!'); } protected void start() { System.out.println('Vehicle Started!!!'); } protected void stop() { System.out.println('Vehicle Stopped!!!'); } private void serviceVehicle() { System.out.println('Vehicle serviced!!'); } }class Main { public static void main(String[] args) { try { Vehicle car = new Vehicle(); // create an object of Class Class obj = car.getClass(); // get all the methods using the getDeclaredMethod() in an array Method[] methods = obj.getDeclaredMethods(); // for each method get method info for(Method m : methods) { System.out.println('Method Name: ' + m.getName()); // get the access modifier of methods int modifier = m.getModifiers(); System.out.print('Modifier: ' + Modifier.toString(modifier) + ' '); // get the return type of method System.out.print('Return Type: ' + m.getReturnType()); System.out.println('
'); } } catch(Exception e) { e.printStackTrace(); } } }
Výkon
Vo vyššie uvedenom programe vidíme, že metóda getDeclaredMethods vracia pole metód deklarovaných triedou. Potom prechádzame týmto poľom a zobrazujeme informácie o každej metóde.
Odraz: Konštruktér
Na kontrolu a úpravu konštruktorov triedy Java môžeme použiť triedu „Constructor“ balíka java.lang.reflect.
Trieda konštruktora poskytuje na tento účel nasledujúce metódy.
Metóda | Popis |
---|---|
getConstructors () | Vráti všetky konštruktory deklarované v triede a jej nadtriede. |
getDeclaredConstructor () | Vráti všetky deklarované konštruktory. |
getName () | Načíta meno konštruktéra. |
getModifiers () | Vráti celočíselnú reprezentáciu modifikátora prístupu konštruktorov. |
getParameterCount () | Vráti celkový počet parametrov pre konštruktory. |
Nižšie uvedený príklad odrazu demonštruje odraz konštruktorov triedy v jazyku Java. Rovnako ako reflexia metódy, aj tu metóda getDeclaredConstructors vracia pole konštruktorov pre triedu. Potom prechádzame týmto poľom konštruktorov, aby sme zobrazili informácie o každom konštruktore.
import java.lang.Class; import java.lang.reflect.*; //declare a class Person with three constructors class Person { public Person() { } //constructor with no parameters public Person(String name) { } //constructor with 1 parameter private Person(String name, int age) {} //constructor with 2 parameters } class Main { public static void main(String[] args) { try { Person person = new Person(); Class obj = person.getClass(); // get array of constructors in a class using getDeclaredConstructor() Constructor[] constructors = obj.getDeclaredConstructors(); System.out.println('Constructors for Person Class:'); for(Constructor c : constructors) { // get names of constructors System.out.println('Constructor Name: ' + c.getName()); // get access modifier of constructors int modifier = c.getModifiers(); System.out.print ('Modifier: ' + Modifier.toString(modifier) + ' '); // get the number of parameters in constructors System.out.println('Parameters: ' + c.getParameterCount()); //if there are parameters, get parameter type of each parameter if(c.getParameterCount() > 0){ Class[] paramList=c.getParameterTypes(); System.out.print ('Constructor parameter types :'); for (Class class1 : paramList) { System.out.print(class1.getName() +' '); } } System.out.println('
'); } } catch(Exception e) { e.printStackTrace(); } } }
Výkon
Nevýhody odrazu
Odraz je silný, ale nemal by sa používať bez rozdielu. Ak je možné pracovať bez použitia odrazu, je lepšie sa mu vyhnúť.
Nižšie je uvedených niekoľko nevýhod reflexie:
- Výkonová réžia: Aj keď je reflexia výkonnou funkciou, reflexné operácie majú stále nižší výkon ako nereflexné operácie. Preto by sme sa mali vyhnúť používaniu odrazov v aplikáciách kritických z hľadiska výkonu.
- Bezpečnostné obmedzenia: Pretože reflexia je funkcia za behu, môže vyžadovať povolenie za behu. Takže pre aplikácie, ktoré vyžadujú spustenie kódu v prostredí s obmedzeným zabezpečením, nemusí byť reflexia k ničomu.
- Expozícia vnútorných priestorov: Použitím reflexie môžeme získať prístup k súkromným poliam a metódam v triede. Reflexia tak zlomí abstrakciu, ktorá by mohla spôsobiť, že kód bude neprenosný a nefunkčný.
často kladené otázky
Otázka 1) Prečo sa v Jave používa Reflection?
Odpoveď: Pomocou reflexie môžeme kontrolovať triedy, rozhrania, konštruktory, polia a metódy za behu, aj keď sú v čase kompilácie anonymné. Táto inšpekcia nám umožňuje upraviť správanie týchto entít za behu.
Otázka č. 2) Kde sa používa Reflection?
Odpoveď: Reflexia sa používa pri písaní rámcov, ktoré spolupracujú s používateľsky definovanými triedami, pričom programátor ani nevie, čo budú triedy alebo iné entity.
Otázka č. 3) Je Java Reflection pomalý?
Odpoveď: Áno, je to pomalšie ako v nereflexnom kóde.
Otázka č. 4) Je Java Reflection zlý?
Odpoveď: Svojím spôsobom áno. Najskôr stratíme bezpečnosť pri kompilácii. Bez bezpečnosti pri kompilácii by sme mohli dostať chyby za behu, ktoré by mohli mať vplyv na koncových používateľov. Taktiež bude ťažké chybu vyladiť.
Otázka č. 5) Ako zastavíte reflexiu v Jave?
Odpoveď: Používaniu reflexie sa jednoducho vyhýbame písaním nereflexných operácií. Alebo možno môžeme použiť niektoré všeobecné mechanizmy, ako napríklad vlastné overenie s odrazom.
Viac informácií o Java Reflection
Balík java.lang.reflect obsahuje triedy a rozhrania, ktoré umožňujú reflexiu. A java.lang.class môže byť použitý ako vstupný bod pre reflexiu.
Ako získať objekty triedy:
1. Ak máte inštanciu objektu,
trieda c = obj.getclass ();
2. Ak poznáš typ triedy,
trieda c = type.getClass ();
3. Ak poznáš názov triedy,
Trieda c = Trieda.nazov („com.demo.Mydemoclass“);
Ako získať členov triedy:
Členmi triedy sú polia (premenné triedy) a metódy.
- getFields () - Používa sa na získanie všetkých polí okrem súkromných polí.
- getDeclaredField () - Používa sa na získanie súkromných polí.
- getDeclaredFields () - Používa sa na získanie súkromného a verejného poľa.
- getMethods () - Používa sa na získanie všetkých metód okrem súkromných.
- getDeclaredMethods () –Používa sa na získanie verejných a súkromných metód.
Demo programy:
ReflectionHelper.java:
Toto je trieda, kde sa chystáme kontrolovať pomocou reflexného API.
najlepší spôsob sťahovania zvuku z youtube
class ReflectionHelper { private int age; private String name; public String deptName; public int empID; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDeptName() { return deptName; } public void setDeptName(String deptName) { this.deptName = deptName; } }
ReflectionDemo.java
public class ReflectionDemo { public static void main(String[] args) throws NoSuchFieldException, SecurityException { //get the class Class ReflectionHelperclass=ReflectionHelper.class; //get the name of the class String className = ReflectionHelperclass.getName(); System.out.println('className=='+className); System.out.println('getModifiers'+ReflectionHelperclass.getModifier s()); System.out.println('getSuperclass'+ReflectionHelperclass.getSupercla ss()); System.out.println('getPackage'+ReflectionHelperclass.getPackage()); Field[] fields =ReflectionHelperclass.getFields(); //getting only the public fields for(Field oneField : fields) { Field field = ReflectionHelperclass.getField(oneField.getName()); String fieldname = field.getName(); System.out.println('only the public fieldnames:::::'+fieldname); } //getting all the fields of the class Field[] privatefields =ReflectionHelperclass.getDeclaredFields(); for(Field onefield : privatefields) { Field field = ReflectionHelperclass.getDeclaredField(onefield.getName()); String fieldname = field.getName(); System.out.println('all the fieldnames in the class:::'+fieldname); } Method[] methods =ReflectionHelperclass.getDeclaredMethods(); for(Method m: methods) { System.out.println('methods::::'+m.getName()); } }}
Záver
Tento tutoriál podrobne vysvetlil Reflection API v Jave. Videli sme, ako vykonať reflexiu tried, rozhraní, polí, metód a konštruktorov spolu s niekoľkými nevýhodami reflexie.
Reflection je pomerne pokročilá funkcia v Jave, ale mali by ju používať programátori, ktorí majú pevnú pozíciu v jazyku. Ak sa totiž nepoužíva opatrne, môže to spôsobiť neočakávané chyby a výsledky.
Aj keď je reflexia silná, mala by sa používať opatrne. Avšak pomocou reflexie môžeme vyvinúť aplikácie, ktoré do runtime nevedia o triedach a iných entitách.
=> Tu si pozrite príručku Java Beginners Guide.
Odporúčané čítanie
- Výukový program triedy skenerov Java s príkladmi
- Celé číslo Java a trieda Java BigInteger s príkladmi
- Výukový program JAVA pre začiatočníkov: viac ako 100 praktických výučbových programov Java Video
- Úvod do programovacieho jazyka Java - videonávod
- Čo je Java Vector | Výukový program Java Vector Class s príkladmi
- Príručka k rozhraniu Java a abstraktnej triede
- Metóda Java substring () - návod s príkladmi
- Výukový program Java Collections Framework (JCF)