java reflection tutorial with examples
Ovaj video tutorial objašnjava što je Reflection i kako ga implementirati pomoću Reflection API-ja:
Refleksija u Javi je provjera i promjena ponašanja programa tijekom izvođenja.
Pomoću ovog API-ja za refleksiju možete pregledati klase, konstruktore, modifikatore, polja, metode i sučelja tijekom izvođenja. Na primjer, možete dobiti naziv predavanja ili možete dobiti detalje o privatnim članovima razreda.
Pročitajte cijelu našu JAVA serija treninga za bolji uvid u Java koncepte.
Evo video vodiča o Java Reflectionu:
Što ćete naučiti:
Refleksija u Javi
Svjesni smo da u datoj klasi možemo mijenjati njezina svojstva i metode u vrijeme kompajliranja, a to je vrlo lako učiniti. Bez obzira jesu li svojstva i metode anonimni ili imaju imena, oni se mogu mijenjati po našoj volji tijekom vremena kompajliranja.
Ali te klase ili metode ili polja ne možemo mijenjati tijekom izvođenja u hodu. Drugim riječima, vrlo je teško promijeniti ponašanje različitih programskih komponenata tijekom izvođenja, posebno za nepoznate objekte.
Java programski jezik nudi značajku tzv 'Odraz' koji nam omogućuje da izmijenimo ponašanje u izvedbi klase ili polja ili metode u vrijeme izvođenja.
Tako se Refleksija može definirati kao a “Tehnika inspekcije i modificiranja runtnog ponašanja nepoznatog objekta u vrijeme izvođenja. Objekt može biti klasa, polje ili metoda. '
Reflection je „Sučelje za programiranje aplikacija“ (API) koje pruža Java.
Postupak 'Refleksije' prikazan je u nastavku.
U gornjoj predstavi možemo vidjeti da imamo nepoznati objekt. Zatim na ovom objektu koristimo Reflection API. Kao rezultat, možemo izmijeniti ponašanje ovog objekta tijekom izvođenja.
Stoga možemo koristiti Reflection API u našim programima u svrhu modificiranja ponašanja objekta. Objekti mogu biti bilo što poput metoda, sučelja, klasa itd. Provjeravamo te objekte, a zatim mijenjamo njihovo ponašanje tijekom izvođenja pomoću API-ja za refleksiju.
U Javi su 'java.lang' i 'java.lang.reflect' dva paketa koja nude klase za razmišljanje. Posebna klasa 'java.lang.Class' pruža metode i svojstva za izdvajanje metapodataka pomoću kojih možemo pregledati i izmijeniti ponašanje klase.
Koristimo Reflection API koji pružaju gornji paketi za modificiranje klase i njezinih članova, uključujući polja, metode, konstruktore itd. Tijekom izvođenja. Karakteristična značajka Reflection API-ja je da također možemo manipulirati članovima privatnih podataka ili metodama klase.
Reflection API se uglavnom koristi u:
- Refleksija se uglavnom koristi u alatima za otklanjanje pogrešaka, JUnit i okvirima za inspekciju i promjenu ponašanja tijekom izvođenja.
- IDE (Integrirano razvojno okruženje) Npr. Eclipse IDE, NetBeans itd.
- Alati za testiranje itd.
- Koristi se kada vaša aplikacija ima biblioteke trećih strana i kada želite znati o dostupnim klasama i metodama.
Reflection API u Javi
Koristeći Reflection API, možemo implementirati refleksiju o sljedećim entitetima:
- Polje : Klasa Field sadrži informacije koje koristimo za deklariranje varijable ili polja poput tipa podataka (int, double, String, itd.), Modifikatora pristupa (privatni, javni, zaštićeni itd.), Imena (identifikatora) i vrijednosti.
- Metoda : Klasa Metoda može nam pomoći da izvučemo informacije poput modifikatora pristupa metode, vrste povratka metode, naziva metode, vrste parametara metode i vrste izuzetaka koje metoda pokreće.
- Graditelj : Klasa konstruktora daje informacije o konstruktoru klase koji uključuje modifikator pristupa konstruktoru, ime konstruktora i vrste parametara.
- Uredi : Klasa modifikatora daje nam informacije o određenom modifikatoru pristupa.
Sve gore navedene klase dio su paketa java.lang.reflect. Dalje, razgovarat ćemo o svakoj od ovih klasa i na primjerima programiranja demonstrirati razmišljanje o tim klasama.
Krenimo prvo s razredom java.lang.Class.
java.lang.Class Class
Java.lang.Clasa sadrži sve informacije i podatke o klasama i objektima u vrijeme izvođenja. Ovo je glavna klasa koja se koristi za razmišljanje.
Klasa java.lang.Class pruža:
- Metode za dohvaćanje metapodataka klase u vrijeme izvođenja.
- Metode za inspekciju i modificiranje ponašanja klase u vrijeme izvođenja.
Stvorite objekte java.lang.Class
Objekte java.lang.Class možemo stvoriti pomoću jedne od sljedećih opcija.
primjeri skriptiranja na različitim web lokacijama u javi
# 1) .proširenje razreda
Prva opcija za stvaranje predmeta klase je pomoću .class ekstenzije.
Na primjer,ako je Test klasa, tada možemo stvoriti objekt Class na sljedeći način:
Class obj_test = Test.class;
Tada možemo koristiti obj_test za izvođenje refleksije jer će ovaj objekt imati sve informacije o klasi Test.
# 2) metoda forName ()
metoda forName () uzima ime klase kao argument i vraća objekt Class.
Na primjer,objekt klase Test može se stvoriti na sljedeći način:
class obj_test = Class.forName (“Test”);
# 3) metoda getClas ()
metoda getClass () koristi objekt klase za dobivanje objekta java.lang.Class.
Na primjer,razmotrite sljedeći dio koda:
Test obj = new Test (); Class obj_test = obj.getClass ();
U prvom smo retku stvorili objekt klase Test. Zatim smo pomoću ovog objekta nazvali metodu 'getClass ()' da bismo dobili objekt obj_test od java.lang.Class.
Nabavite Super Class i Modifikatore pristupa
java.lang.class pruža metodu 'getSuperClass ()' koja se koristi za dobivanje superklase bilo koje klase.
Slično tome, pruža metodu getModifier () koja vraća modifikator pristupa klasi.
Sljedeći primjer pokazuje metodu 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(); } } }
Izlaz
U gornjem primjeru programiranja sučelje Osoba definira se usamljenom metodom ‘display ()’. Zatim definiramo klasu Student koja implementira sučelje osobe. U glavnoj metodi koristimo metodu getClass () da bismo dohvatili objekt Class, a zatim pristupili nadređenom ili superklasi objekta Student pomoću metode getSuperClass ().
Nabavite sučelja
Ako klasa implementira neka sučelja, imena tih sučelja možemo dobiti pomoću metode getInterfaces () metode java.lang.Class. Za to moramo izvesti refleksiju o klasi Java.
Sljedeći primjer programiranja prikazuje upotrebu metode getInterfaces () u Java Reflectionu.
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(); } } }
Izlaz
U gornjem programu definirali smo dva sučelja tj. Animals i PetAnimals. Zatim definiramo klasu Dog koja implementira oba ova sučelja.
U glavnoj metodi dohvaćamo objekt klase Dog u java.lang.Class radi izvođenja refleksije. Tada koristimo metodu getInterfaces () za dohvaćanje sučelja koja implementira klasa Dog.
Refleksija: Dohvatite vrijednost polja
Kao što je već spomenuto, paket java.lang.reflect pruža klasu Field koja nam pomaže da odražavamo članove polja ili podataka u klasi.
U nastavku su navedene metode koje pruža klasa Field za refleksiju polja.
Metoda | Opis |
---|---|
getField ('fieldName') | Vraća polje (javno) s navedenim imenom polja. |
getFields () | Vraća sva javna polja (i za razred i za superklasu). |
getDeclaredFields () | Dohvaća sva polja klase. |
getModifier () | Vraća cjelobrojni prikaz modifikatora pristupa polju. |
set (classObject, vrijednost) | Polju dodjeljuje navedenu vrijednost. |
dobiti (classObject) | Dohvaća vrijednost polja. |
setAccessible (boolean) | Učinite privatno polje dostupnim dodavanjem true. |
getDeclaredField ('fieldName') | Vraća polje s navedenim imenom. |
Dolje su dana dva primjera refleksije koji pokazuju razmišljanje o javnom i privatnom polju.
Java program u nastavku pokazuje razmišljanje o javnom 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(); } } }
Izlaz
U ovom smo programu proglasili razred 'Student' koji ima javno polje StudentName. Zatim pomoću API sučelja klase Field izvodimo refleksiju polja StudentName i dohvaćamo njegov modifikator pristupa i vrijednost.
Sljedeći program izvodi promišljanje o privatnom polju razreda. Operacije su slične, osim što postoji jedan dodatni poziv funkcije upućen za privatno polje. Moramo nazvati setAccessible (true) za privatno polje. Tada provodimo refleksiju na ovom polju na sličan način kao i 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(); } } }
Izlaz
Refleksija: Metoda
Slično poljima klase, također možemo provoditi refleksiju o metodama klase i mijenjati njihovo ponašanje u vrijeme izvođenja. Za to koristimo klasu Method paketa java.lang.reflect.
U nastavku su navedene funkcije koje pruža klasa Method za odraz metode klase.
Metoda | Opis |
---|---|
getMethods () | Dohvaća sve javne metode definirane u klasi i njezinoj superklasi. |
getDeclaredMethod () | Vraća metode deklarirane u klasi. |
getName () | Vraća imena metoda. |
getModifiers () | Vraća cjelobrojni prikaz modifikatora pristupa metode. |
getReturnType () | Vraća tip povratka metode. |
Sljedeći primjer prikazuje odraz metoda klasa u Javi pomoću gornjih API-ja.
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(); } } }
Izlaz
U gornjem programu vidimo da metoda getDeclaredMethods vraća niz metoda koje je deklarirala klasa. Zatim prolazimo kroz ovaj niz i prikazujemo informacije o svakoj metodi.
Refleksija: Konstruktor
Možemo koristiti klasu 'Konstruktor' paketa java.lang.reflect za inspekciju i izmjenu konstruktora Java klase.
U tu svrhu klasa konstruktora pruža sljedeće metode.
Metoda | Opis |
---|---|
getConstructors () | Vraća sve konstruktore deklarirane u klasi i njezinu superklasu. |
getDeclaredConstructor () | Vraća sve deklarirane konstruktore. |
getName () | Dohvaća ime konstruktora. |
getModifiers () | Vraća cjelobrojni prikaz modifikatora pristupa konstruktora. |
getParameterCount () | Vraća ukupan broj parametara za konstruktore. |
Primjer refleksije u nastavku pokazuje refleksiju konstruktora klase u Javi. Poput refleksije metode, i ovdje metoda getDeclaredConstructors vraća niz konstruktora za klasu. Zatim prelazimo kroz ovaj niz konstruktora kako bismo prikazali informacije o svakom konstruktoru.
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(); } } }
Izlaz
Nedostaci refleksije
Refleksija je moćna, ali se ne smije koristiti neselektivno. Ako je moguće raditi bez korištenja refleksije, onda je poželjno izbjegavati ga koristiti.
U nastavku je navedeno nekoliko nedostataka Refleksije:
- Režija izvedbe: Iako je refleksija moćna značajka, reflektirajuće operacije i dalje imaju sporije performanse od nereflektirajućih operacija. Stoga bismo trebali izbjegavati korištenje refleksija u aplikacijama kritičnim za izvedbu.
- Sigurnosna ograničenja: Budući da je refleksija runtime značajka, možda će trebati dozvole za vrijeme izvođenja. Dakle, za aplikacije koje zahtijevaju da se kôd izvrši u ograničenim sigurnosnim postavkama, tada refleksija možda neće biti od koristi.
- Izloženost unutrašnjih dijelova: Korištenjem refleksije možemo pristupiti privatnim poljima i metodama u klasi. Tako refleksija razbija apstrakciju koja bi kod mogla učiniti neportibilnim i nefunkcionalnim.
Često postavljana pitanja
P # 1) Zašto se Reflection koristi u Javi?
Odgovor: Korištenjem refleksije možemo pregledati klase, sučelja, konstruktore, polja i metode tijekom izvođenja, čak i ako su anonimni u vrijeme kompajliranja. Ova inspekcija omogućuje nam modificiranje ponašanja tih entiteta tijekom izvođenja.
P # 2) Gdje se koristi Reflection?
Odgovor: Refleksija se koristi u pisanju okvira koji komuniciraju s korisnički definiranim klasama, pri čemu programer ni ne zna koje će klase ili drugi entiteti biti.
3. pitanje) Je li Java Reflection spor?
Odgovor: Da, sporiji je od nerefleksnog koda.
P # 4) Je li Java Reflection loš?
Odgovor: Na neki način, da. Prije svega, gubimo sigurnost tijekom kompajliranja. Bez sigurnosti tijekom kompajliranja mogli bismo dobiti pogreške tijekom izvođenja koje mogu utjecati na krajnje korisnike. Također će biti teško otkloniti pogreške.
5. pitanje) Kako zaustaviti Reflection u Javi?
Odgovor: Jednostavno izbjegavamo koristiti refleksiju zapisujući operacije nerefleksije. Ili možda možemo koristiti neke generičke mehanizme poput prilagođene provjere valjanosti s refleksijom.
Više o Java Reflectionu
java.lang.reflect paket ima klase i sučelja za odražavanje. A java.lang.class može se koristiti kao ulazna točka za odraz.
Kako doći do predmeta klase:
1. Ako imate primjerak objekta,
klasa c = obj.getclass ();
2. Ako znate tip predavanja,
klasa c = type.getClass ();
3. Ako znate naziv klase,
Klasa c = Class.forName (“com.demo.Mydemoclass”);
Kako dobiti članove razreda:
Članovi razreda su polja (varijable klase) i metode.
- getFields () - Koristi se za dobivanje svih polja, osim privatnih.
- getDeclaredField () - Koristi se za dobivanje privatnih polja.
- getDeclaredFields () - Koristi se za dobivanje privatnih i javnih polja.
- getMethods () - Koristi se za dobivanje svih metoda, osim privatnih.
- getDeclaredMethods () –Koristi se za dobivanje javnih i privatnih metoda.
Demo programi:
ReflectionHelper.java:
Ovo je klasa u kojoj ćemo pregledati pomoću API-ja za refleksiju.
najbolji youtube u mp4 pretvarač na mreži
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čak
Ovaj je vodič detaljno objasnio API Reflection u Javi. Vidjeli smo kako izvesti refleksiju klasa, sučelja, polja, metoda i konstruktora, zajedno s nekoliko nedostataka refleksije.
Reflection je relativno napredna značajka u Javi, ali trebali bi je koristiti programeri koji imaju uporište u jeziku. To je zato što može uzrokovati neočekivane pogreške i rezultate ako se ne upotrebljava oprezno.
Iako je odraz snažan, treba ga pažljivo koristiti. Ipak, pomoću refleksije možemo razvijati aplikacije koje nisu svjesne klasa i drugih entiteta do vremena izvođenja.
=> Ovdje pogledajte Vodič za početnike za Java.
Preporučena literatura
- Vodič za razred Java Scannera s primjerima
- Java Integer i Java BigInteger klasa s primjerima
- JAVA Tutorial za početnike: 100+ praktičnih Java Video tutorijala
- Uvod u programski jezik Java - Video vodič
- Što je Java Vector | Vodič za Java Vector Class s primjerima
- Java sučelje i udžbenik klase sažetak sa primjerima
- Metoda Java podniz () - Vodič s primjerima
- Vodič za Java Collections Framework (JCF)