java reflection tutorial with examples
Овај видео водич објашњава шта је Рефлецтион и како то применити помоћу Рефлецтион АПИ-ја:
Рефлексија у Јави је инспекција и промена понашања програма током извођења.
Уз помоћ овог АПИ-ја за рефлексију можете да прегледате класе, конструкторе, модификаторе, поља, методе и интерфејсе током извођења. На пример, можете добити име класе или можете добити детаље о приватним члановима разреда.
Прочитајте читав наш текст ЈАВА серија тренинга за бољи увид у Јава концепте.
Ево видео водича о Јава Рефлецтиону:
Шта ћете научити:
Рефлецтион ин Јава
Свесни смо да у датој класи можемо да модификујемо њена својства и методе у време компајлирања и врло је лако то учинити. Без обзира да ли су својства и методе анонимни или имају имена, они се могу мењати по нашој вољи током времена компајлирања.
Али ове класе или методе или поља не можемо променити у току рада у ходу. Другим речима, врло је тешко променити понашање различитих програмских компонената током извођења, посебно за непознате објекте.
Јава програмски језик пружа функцију тзв „Рефлецтион“ који нам омогућава да модификујемо понашање током извођења класе или поља или методе током извођења.
Тако се Рефлексија може дефинисати као а „Техника инспекције и модификовања понашања непознатог објекта током извођења. Објекат може бити класа, поље или метода “.
Рефлецтион је „Интерфејс за програмирање апликација“ (АПИ) који обезбеђује Јава.
Процес „Рефлексије“ је приказан у наставку.
У горњој представи видимо да имамо непознати објекат. Тада на овом објекту користимо АПИ Рефлецтион. Као резултат, можемо да изменимо понашање овог објекта током извођења.
Стога можемо користити АПИ Рефлецтион у нашим програмима у сврху модификовања понашања објекта. Објекти могу бити било шта попут метода, интерфејса, класа итд. Проверавамо те објекте, а затим мењамо њихово понашање током извођења користећи АПИ рефлексије.
У Јави су „јава.ланг“ и „јава.ланг.рефлецт“ два пакета која нуде класе за размишљање. Посебна класа „јава.ланг.Цласс“ пружа методе и својства за издвајање метаподатака помоћу којих можемо прегледати и изменити понашање класе.
АПИ Рефлецтион који пружају горњи пакети користимо за модификовање класе и њених чланова, укључујући поља, методе, конструкторе итд. Током извођења. Карактеристична карактеристика Рефлецтион АПИ-ја је да такође можемо манипулисати члановима приватних података или методама класе.
Рефлецтион АПИ се углавном користи у:
- Рефлексија се углавном користи у алаткама за отклањање грешака, ЈУнит и оквирима за инспекцију и промену понашања током извођења.
- ИДЕ (Интегрисано развојно окружење) На пример. Ецлипсе ИДЕ, НетБеанс итд.
- Тест Тоолс итд.
- Користи се када ваша апликација има библиотеке независних произвођача и када желите да знате о класама и доступним методама.
АПИ за рефлексију у Јави
Користећи Рефлецтион АПИ, можемо применити рефлексију на следеће ентитете:
- Поље : Класа Фиелд садржи информације које користимо за декларацију променљиве или поља попут типа података (инт, доубле, Стринг, итд.), Модификатора приступа (приватни, јавни, заштићени итд.), Имена (идентификатора) и вредности.
- Метод : Класа Метход може нам помоћи да издвојимо информације попут модификатора приступа методе, типа повратка методе, имена методе, типова параметара методе и типова изузетака које је метода покренула.
- Градитељ : Класа конструктора даје информације о конструктору класе која укључује модификатор приступа конструктору, име конструктора и типове параметара.
- Уредити : Класа Модификатор даје нам информације о одређеном модификатору приступа.
Све горе наведене класе су део пакета јава.ланг.рефлецт. Затим ћемо разговарати о свакој од ових класа и на примерима програмирања демонстрирати размишљање о тим часовима.
Почнимо прво са класом јава.ланг.Цласс.
јава.ланг.Цласс Цласс
Јава.ланг.Тхе класа садржи све информације и податке о класама и објектима током извођења. Ово је главна класа која се користи за размишљање.
Класа јава.ланг.Цласс пружа:
- Методе за преузимање метаподатака класе у време извођења.
- Методе за инспекцију и модификовање понашања класе у време извођења.
Направите јава.ланг.Цласс објекте
Објекте јава.ланг.Цласс можемо створити помоћу једне од следећих опција.
креира низ низова у јави
# 1) .проширење класе
Прва опција за креирање објекта класе је коришћење екстензије .цласс.
На пример,ако је Тест класа, тада можемо створити објект Цласс на следећи начин:
Class obj_test = Test.class;
Тада можемо користити обј_тест за извођење рефлексије јер ће овај објекат имати све информације о класи Тест.
# 2) метода форНаме ()
метода форНаме () узима име класе као аргумент и враћа објект класе.
На пример,објект класе Тест може се креирати на следећи начин:
class obj_test = Class.forName (“Test”);
# 3) метода гетЦлас ()
метода гетЦласс () користи објект класе да би добила објект јава.ланг.Цласс.
На пример,размотрите следећи део кода:
Test obj = new Test (); Class obj_test = obj.getClass ();
У првом реду смо креирали објекат класе Тест. Затим смо помоћу овог објекта позвали методу „гетЦласс ()“ да бисмо добили објекат обј_тест од јава.ланг.Цласс.
Набавите модификаторе Супер Цласс & Аццесс
јава.ланг.цласс пружа методу „гетСуперЦласс ()“ која се користи за добивање суперкласе било које класе.
Слично томе, пружа методу гетМодифиер () која враћа модификатор приступа класи.
Пример у наставку приказује методу гетСуперЦласс ().
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(); } } }
Оутпут
У горе наведеном примеру програмирања, интерфејс Персон је дефинисан усамљеном методом ‘дисплаи ()’. Затим дефинишемо класу Студент која имплементира интерфејс особе. У главној методи користимо методу гетЦласс () да бисмо преузели објекат Цласс, а затим приступили родитељу или суперкласи објекта Студент помоћу методе гетСуперЦласс ().
Набавите интерфејсе
Ако класа имплементира неке интерфејсе, тада можемо добити имена ових интерфејса помоћу методе гетИнтерфацес () методе јава.ланг.Цласс. За ово морамо извршити рефлексију о класи Јава.
Следећи пример програмирања приказује употребу методе гетИнтерфацес () у Јава Рефлецтион.
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(); } } }
Оутпут
У горњем програму дефинисали смо два интерфејса, тј. Анималс и ПетАнималс. Затим дефинишемо класу Дог која имплементира оба ова интерфејса.
У главној методи дохваћамо објекат класе Дог у јава.ланг.Цласс да бисмо извршили рефлексију. Затим користимо методу гетИнтерфацес () за дохваћање интерфејса које имплементира класа Дог.
Рефлексија: Добијте вредност поља
Као што је већ поменуто, пакет јава.ланг.рефлецт пружа класу Фиелд која нам помаже да рефлектујемо чланове поља или података у класи.
У наставку су наведене методе које пружа класа Фиелд за одраз поља.
Метод | Опис |
---|---|
гетФиелд ('фиелдНаме') | Враћа поље (јавно) са наведеним именом поља. |
гетФиелдс () | Враћа сва јавна поља (и за класу и за суперкласу). |
гетДецларедФиелдс () | Дохваћа сва поља класе. |
гетМодифиер () | Враћа целобројни приказ модификатора приступа пољу. |
скуп (цлассОбјецт, вредност) | Пољу додељује наведену вредност. |
гет (цлассОбјецт) | Дохваћа вредност поља. |
сетАццессибле (боолеан) | Учините приватно поље доступним додавањем труе. |
гетДецларедФиелд ('фиелдНаме') | Враћа поље са наведеним именом. |
Доље су дата два примера рефлексије која показују рефлексију на јавном и приватном пољу.
Јава програм у наставку показује размишљање о јавном пољу.
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(); } } }
Оутпут
У овом програму прогласили смо разред „Студент“ који има јавно поље СтудентНаме. Затим помоћу АПИ интерфејса класе Фиелд вршимо рефлексију поља СтудентНаме и дохваћамо његов модификатор приступа и вредност.
Следећи програм изводи рефлексију на приватном пољу часа. Операције су сличне, осим што постоји један додатни позив функције упућен за приватно поље. Морамо позвати сетАццессибле (труе) за приватно поље. Тада вршимо рефлексију на овом пољу на сличан начин као и на јавном пољу.
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(); } } }
Оутпут
Рефлексија: Метода
Слично пољима класе, такође можемо вршити рефлексију о методама класе и мењати њихово понашање током извођења. За ово користимо класу Метход пакета јава.ланг.рефлецт.
У наставку су наведене функције које пружа класа Метход за одраз методе класе.
Метод | Опис |
---|---|
гетМетходс () | Дохваћа све јавне методе дефинисане у класи и њеној суперкласи. |
гетДецларедМетход () | Враћа методе декларисане у класи. |
гетНаме () | Враћа имена метода. |
гетМодифиерс () | Приказује целобројни приказ модификатора приступа методе. |
гетРетурнТипе () | Враћа тип повратка методе. |
Пример у наставку приказује одраз метода класа у Јави користећи горње АПИ-је.
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(); } } }
Оутпут
У горњем програму видимо да метода гетДецларедМетходс враћа низ метода које је декларовала класа. Затим прелиставамо овај низ и приказујемо информације о свакој методи.
Рефлексија: конструктор
Можемо користити класу „Конструктор“ пакета јава.ланг.рефлецт за преглед и модификовање конструктора Јава класе.
У ову сврху класа конструктор пружа следеће методе.
Метод | Опис |
---|---|
гетЦонструцторс () | Враћа све конструкторе декларисане у класи и њену суперкласу. |
гетДецларедЦонструцтор () | Враћа све декларисане конструкторе. |
гетНаме () | Дохваћа име конструктора. |
гетМодифиерс () | Враћа целобројни приказ модификатора приступа конструктора. |
гетПараметерЦоунт () | Даје укупан број параметара за конструкторе. |
Пример рефлексије у наставку показује рефлексију конструктора класе у Јави. Попут рефлексије методе, и овде метода гетДецларедЦонструцторс враћа низ конструктора за класу. Затим прелазимо кроз овај низ конструктора да бисмо приказали информације о сваком конструктору.
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(); } } }
Оутпут
Недостаци рефлексије
Рефлексија је моћна, али је не треба користити неселективно. Ако је могуће радити без коришћења рефлексије, онда је пожељно избегавати употребу.
У наставку је наведено неколико недостатака Рефлексије:
- Режијски учинак: Иако је рефлексија моћна карактеристика, рефлективне операције и даље имају спорије перформансе од нерефлектујућих операција. Стога би требало да избегавамо коришћење рефлексије у апликацијама критичним за перформансе.
- Безбедносна ограничења: Како је рефлексија рунтиме функција, можда ће јој требати дозволе за рад. Дакле, за апликације које захтевају да се код изврши у ограниченом безбедносном окружењу, одраз можда неће бити од користи.
- Изложеност унутрашњости: Користећи рефлексију, можемо приступити приватним пољима и методама у класи. Тако рефлексија разбија апстракцију која би код могла учинити непортибилним и нефункционалним.
Често постављана питања
П # 1) Зашто се Рефлецтион користи у Јави?
Одговор: Користећи рефлексију можемо да извршимо инспекцију класа, интерфејса, конструктора, поља и метода током извршавања, чак и ако су анонимни у време компајлирања. Ова инспекција нам омогућава да изменимо понашање ових ентитета током извођења.
К # 2) Где се користи Рефлецтион?
Одговор: Рефлексија се користи у писању оквира који комуницирају са кориснички дефинисаним класама, при чему програмер ни не зна које ће класе или други ентитети бити.
К # 3) Да ли је Јава Рефлецтион спор?
Одговор: Да, спорији је од нерефлексног кода.
К # 4) Да ли је Јава Рефлецтион лош?
Одговор: На неки начин, да. Пре свега, губимо сигурност при компајлирању. Без сигурности при компајлирању, могли бисмо добити грешке током извођења које могу утицати на крајње кориснике. Такође ће бити тешко отклонити грешку.
К # 5) Како зауставити Рефлецтион у Јави?
Одговор: Једноставно избегавамо употребу рефлексије писањем операција нерефлексије. Или можда можемо користити неке генеричке механизме попут прилагођене валидације са рефлексијом.
Више о Јава Рефлецтиону
јава.ланг.рефлецт пакет има класе и интерфејсе за одражавање. А јава.ланг.цласс може се користити као улазна тачка за одраз.
Како доћи до предмета класе:
1. Ако имате примерак објекта,
класа ц = обј.гетцласс ();
2. Ако знате тип предавања,
класа ц = типе.гетЦласс ();
3. Ако знате назив класе,
Класа ц = Цласс.форНаме („цом.демо.Мидемоцласс“);
Како добити чланове разреда:
Чланови класе су поља (променљиве класе) и методе.
- гетФиелдс () - Користи се за добијање свих поља, осим приватних.
- гетДецларедФиелд () - Користи се за добијање приватних поља.
- гетДецларедФиелдс () - Користи се за добијање приватних и јавних поља.
- гетМетходс () - Користи се за добијање свих метода, осим приватних.
- гетДецларедМетходс () –Користи се за добијање јавних и приватних метода.
Демо програми:
РефлецтионХелпер.јава:
Ово је класа у којој ћемо прегледати помоћу АПИ-ја за рефлексију.
недефинисана грешка референце ц ++
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; } }
РефлецтионДемо.јава
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()); } }}
Закључак
Овај водич је детаљно објаснио АПИ Рефлецтион у Јави. Видели смо како да изведемо рефлексију класа, интерфејса, поља, метода и конструктора заједно са неколико недостатака рефлексије.
Рефлексија је релативно напредна карактеристика у Јави, али би је требали користити програмери који имају упориште у језику. То је зато што може проузроковати неочекиване грешке и резултате ако се не користи опрезно.
Иако је одраз моћан, треба га пажљиво користити. Без обзира на то, користећи рефлексију, можемо развијати апликације које нису свесне класа и других ентитета до времена извршавања.
=> Овде погледајте водич за почетнике Јава.
Препоручено читање
- Водич за класу Јава Сцаннер са примерима
- Јава Интегер и Јава БигИнтегер класа са примерима
- Водич за ЈАВА за почетнике: 100+ практичних Јава видео водича
- Увод у програмски језик Јава - Видео водич
- Шта је Јава Вецтор | Водич за Јава векторске часове са примерима
- Јава интерфејс и лекција са апстрактним часовима са примерима
- Метода Јава подниз () - Водич са примерима
- Водич за Јава Цоллецтионс Фрамеворк (ЈЦФ)