java reflection tutorial with examples
Ta video vadnica pojasnjuje, kaj je Reflection in kako jo uporabiti z API Reflection:
Razmislek v Javi je pregled in spreminjanje vedenja programa med izvajanjem.
S pomočjo tega API-ja za razmislek lahko med izvajanjem pregledate razrede, konstruktorje, modifikatorje, polja, metode in vmesnike. Na primer, lahko dobite ime predavanja ali podrobnosti o zasebnih članih predavanja.
Preberite našo celoto JAVA serija treningov za večji vpogled v koncepte Java.
Tu je video vadnica o razmisleku o Javi:
Kaj se boste naučili:
Odsev v Javi
Zavedamo se, da lahko v danem razredu spremenimo njegove lastnosti in metode v času prevajanja, kar je zelo enostavno. Ne glede na to, ali so lastnosti in metode anonimne ali imajo imena, jih lahko med prevajanjem spremenimo po naši volji.
Teh razredov ali metod ali pol pa med izvajanjem ne moremo spremeniti sproti. Z drugimi besedami, zelo težko je spremeniti vedenje različnih programskih komponent med izvajanjem, zlasti za neznane predmete.
Programski jezik Java ponuja funkcijo, imenovano 'Odsev' ki nam omogoča, da spremenimo obnašanje razreda ali polja ali metode med izvajanjem.
Tako lahko Odsev definiramo kot a “Tehnika pregleda in spreminjanja vedenja med izvajanjem neznanega predmeta med izvajanjem. Predmet je lahko razred, polje ali metoda. '
Reflection je »vmesnik za programiranje aplikacij« (API), ki ga zagotavlja Java.
Postopek »Refleksije« je prikazan spodaj.
V zgornji predstavitvi lahko vidimo, da imamo neznan predmet. Nato za ta objekt uporabimo API Reflection. Kot rezultat lahko spremenimo vedenje tega predmeta med izvajanjem.
Tako lahko API Reflection v naših programih uporabimo za spreminjanje vedenja predmeta. Predmeti so lahko karkoli, kot so metode, vmesniki, razredi itd. Te predmete pregledamo in nato spremenimo njihovo vedenje med izvajanjem z uporabo API-ja za odsev.
V Javi sta 'java.lang' in 'java.lang.reflect' dva paketa, ki ponujata razrede za razmislek. Posebni razred 'java.lang.Class' ponuja metode in lastnosti za pridobivanje metapodatkov, s pomočjo katerih lahko pregledamo in spremenimo vedenje razreda.
Za spreminjanje razreda in njegovih članov, vključno s polji, metodami, konstruktorji itd., Med izvajanjem uporabljamo API Reflection, ki ga ponujajo zgornji paketi. Značilnost Reflection API je, da lahko manipuliramo tudi s člani zasebnih podatkov ali metodami razreda.
Reflection API se uporablja predvsem v:
- Odsev se uporablja predvsem v orodjih za odpravljanje napak, JUnit in ogrodjih za pregled in spreminjanje vedenja med izvajanjem.
- IDE (integrirano razvojno okolje) Npr. Eclipse IDE, NetBeans itd.
- Testna orodja itd.
- Uporablja se, kadar ima vaša aplikacija neodvisne knjižnice in ko želite vedeti o razpoložljivih razredih in metodah.
Reflection API v Javi
Z API-jem Reflection lahko izvedemo razmislek o naslednjih entitetah:
- Polje : Razred Field vsebuje informacije, ki jih uporabljamo za razglasitev spremenljivke ali polja, kot so podatkovni tip (int, double, String itd.), Modifikator dostopa (zasebni, javni, zaščiteni itd.), Ime (identifikator) in vrednost.
- Metoda : Razred metode nam lahko pomaga pri pridobivanju informacij, kot so modifikator dostopa do metode, vrsta vrnitve metode, ime metode, tipi parametrov metode in izjeme, ki jih metoda sproži.
- Graditelj : Razred konstruktorja daje informacije o konstruktorju razreda, ki vključuje modifikator dostopa do konstruktorja, ime konstruktorja in vrste parametrov.
- Uredi : Razred Modifier nam daje informacije o določenem modifikatorju dostopa.
Vsi zgornji razredi so del paketa java.lang.reflect. Nato bomo razpravljali o vsakem od teh razredov in na primerih programiranja prikazali razmislek o teh razredih.
Najprej začnimo z razredom java.lang.Class.
java.lang.Razred razreda
Razred java.lang.Ras vsebuje vse informacije in podatke o razredih in predmetih med izvajanjem. To je glavni razred za razmislek.
Razred java.lang.Class zagotavlja:
- Metode za pridobivanje metapodatkov razreda med izvajanjem.
- Metode za pregledovanje in spreminjanje vedenja razreda med izvajanjem.
Ustvari predmete java.lang.Class
Predmete java.lang.Class lahko ustvarimo z eno od naslednjih možnosti.
brezplačni ponudniki e-poštnih računov v ZDA -
# 1) .razširitev razreda
Prva možnost za ustvarjanje predmeta razreda je z uporabo razširitve .class.
Na primer,če je Test razred, lahko objekt Class ustvarimo na naslednji način:
Class obj_test = Test.class;
Nato lahko uporabimo obj_test za izvedbo refleksije, saj bo imel ta predmet vse informacije o razredu Test.
# 2) metoda forName ()
metoda forName () za argument vzame ime razreda in vrne objekt Class.
Na primer,objekt razreda Test je mogoče ustvariti na naslednji način:
class obj_test = Class.forName (“Test”);
# 3) metoda getClas ()
metoda getClass () uporablja objekt razreda za pridobitev predmeta java.lang.Class.
Na primer,upoštevajte naslednji del kode:
Test obj = new Test (); Class obj_test = obj.getClass ();
V prvi vrstici smo ustvarili objekt razreda Test. Nato smo s tem objektom poklicali metodo »getClass ()«, da dobimo objekt obj_test java.lang.Class.
Pridobite Super Class & Modifikatorje dostopa
java.lang.class ponuja metodo “getSuperClass ()”, ki se uporablja za pridobitev nadrazreda katerega koli razreda.
Podobno zagotavlja metodo getModifier (), ki vrne modifikator dostopa razreda.
Spodnji primer prikazuje metodo 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(); } } }
Izhod
V zgornjem primeru programiranja je vmesnik Person definiran s samostojno metodo ‘display ()’. Nato definiramo študentski razred, ki izvaja vmesnik osebe. V glavni metodi uporabljamo metodo getClass () za pridobivanje predmeta Class in nato z metodo getSuperClass () dostopamo do nadrejenega ali nadrazreda predmeta Student.
Pridobite vmesnike
Če razred izvaja nekatere vmesnike, lahko imena teh vmesnikov dobimo z uporabo metode getInterfaces () metode java.lang.Class. Za to moramo opraviti razmislek o razredu Java.
Spodnji primer programiranja prikazuje uporabo metode getInterfaces () v 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(); } } }
Izhod
V zgornjem programu smo opredelili dva vmesnika, to sta Animals in PetAnimals. Nato definiramo razred Dog, ki izvaja oba vmesnika.
V glavni metodi pridobimo predmet razreda Dog v java.lang.Class za izvedbo refleksije. Nato z metodo getInterfaces () pridobimo vmesnike, ki jih izvaja razred Dog.
Reflection: Pridobite vrednost polja
Kot smo že omenili, paket java.lang.reflect ponuja razred Field, ki nam pomaga, da odraža polje ali podatke v razredu.
Spodaj so navedene metode, ki jih nudi razred Field za odsev polja.
Metoda | Opis |
---|---|
getField ('fieldName') | Vrne polje (javno) z navedenim imenom polja. |
getFields () | Vrne vsa javna polja (tako za razred kot za super razred). |
getDeclaredFields () | Pridobi vsa polja razreda. |
getModifier () | Vrne celoštevilčno predstavitev modifikatorja dostopa do polja. |
set (classObject, vrednost) | Polju dodeli določeno vrednost. |
get (classObject) | Pridobi vrednost polja. |
setAccessible (logična vrednost) | Omogočite dostop do zasebnega polja tako, da prenesete true |
getDeclaredField ('fieldName') | Vrne polje z navedenim imenom. |
Spodaj sta dva primera refleksije, ki prikazujeta razmišljanje o javnem in zasebnem področju.
Spodnji program Java prikazuje razmislek o javnem polju.
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(); } } }
Izhod
V tem programu smo razglasili razred »Študent« z javnim poljem Študentsko ime. Nato z API vmesnikom razreda Field izvedemo odsev polja StudentName in pridobimo njegov modifikator dostopa in vrednost.
Naslednji program izvaja razmislek o zasebnem polju predavanja. Operacije so podobne, le da je za zasebno polje izveden en dodaten klic funkcije. Za zasebno polje moramo poklicati setAccessible (true). Nato izvedemo razmislek o tem področju na podoben način kot javno polje.
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(); } } }
Izhod
Refleksija: metoda
Podobno kot polja razreda lahko tudi mi izvajamo razmislek o metodah razreda in spreminjamo njihovo vedenje v času izvajanja. Za to uporabljamo razred Method paketa java.lang.reflect.
Spodaj so navedene funkcije, ki jih nudi razred Method za odsev metode razreda.
Metoda | Opis |
---|---|
getMethods () | Pridobi vse javne metode, definirane v razredu in njegovem superrazredu. |
getDeclaredMethod () | Vrne metode, razglašene v razredu. |
getName () | Vrne imena metod. |
getModifiers () | Vrne celoštevilčno predstavitev modifikatorja dostopa metode. |
getReturnType () | Vrne vrsto vrnitve metode. |
Spodnji primer prikazuje odraz metod razredov v Javi z uporabo zgornjih API-jev.
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(); } } }
Izhod
V zgornjem programu vidimo, da metoda getDeclaredMethods vrne polje metod, ki jih je razglasil razred. Nato preletimo skozi to matriko in prikažemo informacije o vsaki metodi.
Odsev: konstruktor
Za pregled in spreminjanje konstruktorjev razreda Java lahko uporabimo razred konstruktorja paketa java.lang.reflect.
V ta namen razred konstruktorja ponuja naslednje metode.
Metoda | Opis |
---|---|
getConstructors () | Vrne vse konstruktorje, razglašene v razredu, in njegov superrazred. |
getDeclaredConstructor () | Vrne vse deklarirane konstruktorje. |
getName () | Pridobi ime konstruktorja. |
getModifiers () | Vrne celoštevilčno predstavitev modifikatorja dostopa konstruktorjev. |
getParameterCount () | Vrne skupno število parametrov za konstruktorje. |
Spodnji primer odseva prikazuje odsev konstruktorjev razreda v Javi. Tako kot odsev metode, tudi tukaj metoda getDeclaredConstructors vrne vrsto konstruktorjev za razred. Nato prehodimo skozi to polje konstruktorja, da prikažemo informacije o vsakem konstruktorju.
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(); } } }
Izhod
Slabosti refleksije
Odsev je močan, vendar ga ne bi smeli uporabljati vsesplošno. Če je možno delovati brez uporabe odseva, se je bolje izogniti uporabi.
Spodaj je navedenih nekaj pomanjkljivosti Reflection:
- Režijski stroški: Čeprav je odsev močna lastnost, imajo odsevne operacije še vedno počasnejše delovanje kot odsevne operacije. Zato se moramo izogibati uporabi odsevov v aplikacijah, ki so kritične za delovanje.
- Varnostne omejitve: Ker je odsev izvajalna funkcija, bo morda zahteval dovoljenja za čas izvajanja. Torej za aplikacije, ki zahtevajo izvajanje kode v omejeni varnostni nastavitvi, odsev morda ne bo koristen.
- Izpostavljenost notranjih delov: Z uporabo refleksije lahko dostopamo do zasebnih polj in metod v razredu. Tako refleksija razbije abstrakcijo, zaradi katere bi bila koda neprimerna in nefunkcionalna.
Pogosto zastavljena vprašanja
V # 1) Zakaj se Reflection uporablja v Javi?
Odgovor: Z uporabo refleksije lahko med izvajanjem pregledamo razrede, vmesnike, konstruktorje, polja in metode, tudi če so v času prevajanja anonimni. Ta pregled nam omogoča spreminjanje vedenja teh entitet med izvajanjem.
Q # 2) Kje se uporablja Reflection?
Odgovor: Refleksija se uporablja pri pisanju okvirov, ki delujejo z uporabniško določenimi razredi, pri čemer programer niti ne ve, kakšni bodo razredi ali druge entitete.
Q # 3) Je Java Reflection počasen?
Odgovor: Da, počasneje je kot neodsevna koda.
Q # 4) Je Java Reflection slab?
Odgovor: Da, na nek način. Najprej izgubimo varnost pred prevajanjem. Brez varnosti pri prevajanju lahko dobimo napake med izvajanjem, ki lahko vplivajo na končne uporabnike. Prav tako bo težko odpraviti napako.
V # 5) Kako ustaviti Razmislek v Javi?
Odgovor: Preprosto se izogibamo uporabi refleksije s pisanjem nerefleksnih operacij. Ali pa lahko uporabimo nekatere splošne mehanizme, kot je validacija po meri z razmislekom.
Več o odsevu Java
Paket java.lang.reflect ima razrede in vmesnike za razmislek. In java.lang.class se lahko uporablja kot vstopna točka za razmislek.
Kako dobiti predmete razreda:
1. Če imate primerek predmeta,
razred c = obj.getclass ();
2. Če poznate vrsto predavanja,
razred c = type.getClass ();
3. Če poznate ime predavanja,
Razred c = Class.forName (“com.demo.Mydemoclass”);
Kako priti do učencev:
Člani razreda so polja (spremenljivke razreda) in metode.
- getFields () - Uporablja se za pridobivanje vseh polj, razen zasebnih polj.
- getDeclaredField () - Uporablja se za pridobivanje zasebnih polj.
- getDeclaredFields () - Uporablja se za zasebna in javna polja.
- getMethods () - Uporablja se za pridobivanje vseh metod, razen zasebnih.
- getDeclaredMethods () –Uporablja se za uporabo javnih in zasebnih metod.
Predstavitveni programi:
ReflectionHelper.java:
To je razred, v katerem bomo pregledali z uporabo API-ja za odsev.
c ++ širina prvo iskanje
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()); } }}
Zaključek
V tej vadnici je podrobno razložen API Reflection v Javi. Videli smo, kako izvesti refleksijo razredov, vmesnikov, polj, metod in konstruktorjev, skupaj z nekaj pomanjkljivostmi refleksije.
Reflection je sorazmerno napredna funkcija v Javi, vendar bi jo morali uporabljati programerji, ki imajo močan jezik. To pa zato, ker lahko povzroči previdne napake in rezultate, če jih ne uporabljate previdno.
Čeprav je odsev močan, ga je treba uporabljati previdno. Kljub temu lahko z uporabo refleksije razvijemo aplikacije, ki ne poznajo razredov in drugih entitet do časa izvajanja.
=> Tukaj si oglejte Vodnik za začetnike Java.
Priporočeno branje
- Vadnica razreda Java Scanner Class z primeri
- Java Integer in Java BigInteger Class z primeri
- JAVA Vadnica za začetnike: 100+ praktičnih Javnih video vadnic
- Uvod v programski jezik Java - Video vadnica
- Kaj je Java Vector | Vadnica Java Vector Class s primeri
- Vadnica Java vmesnika in abstraktnega razreda s primeri
- Metoda Java substring () - Vadnica s primeri
- Vadnica za Java Collections Framework (JCF)