Шта је Рефлецтион у Јави?
Јава Рефлецтион је процес анализе и модификовања свих могућности класе током извођења. АПИ рефлексије у Јави се користи за манипулисање класом и њеним члановима који укључују поља, методе, конструктор итд. Током извођења.
Једна од предности АПИ-ја за размишљање у Јави је што може да манипулише и приватним члановима класе.
Пакет јава.ланг.рефлецт пружа многе класе за имплементацију рефлексије јава.Методе класе јава.ланг.Цласс се користе за прикупљање комплетних метаподатака одређене класе.
У овом упутству ћете научити-
- Шта је Рефлексија
- Предавање у пакету јава.ланг.рефлецт
- Методе коришћене у јава.ланг.Цласс
- Како добити потпуне информације о предавању
- Пример 1: Како доћи до метаподатака класе
- Пример 2: Како доћи до метаподатака променљиве
- Пример 3: Како доћи до метаподатака методе
- Пример 4: Како доћи до метаподатака конструктора
Предавање у пакету јава.ланг.рефлецт
Следи листа различитих Јава класа у јава.ланг.пацкаге за примену рефлексије-
- Поље : Ова класа се користи за прикупљање декларативних информација као што су тип података, модификатор приступа, име и вредност променљиве.
- Метод : Ова класа се користи за прикупљање декларативних информација као што су модификатор приступа, тип повратка, име, типови параметара и тип изузетка методе.
- Конструктор : Ова класа се користи за прикупљање декларативних информација попут модификатора приступа, имена и типова параметара конструктора.
- Модификатор : Ова класа се користи за прикупљање информација о одређеном модификатору приступа.
Методе коришћене у јава.ланг.Цласс
- Јавни низ гетНаме () : Враћа име класе.
- јавна класа гетСуперцласс () : Враћа референцу супер класе
- Јавна класа [] гетИнтерфацес () : Враћа низ интерфејса које је имплементирала наведена класа
- Јавно у гетМодифиерс (): Враћа целобројну вредност која представља модификаторе наведене класе која треба да се проследи као параметар у методу „ јавни статички низ Стринг тоСтринг (инт и)“ који враћа спецификатор приступа за дату класу.
Како добити потпуне информације о предавању
Да бисмо добили информације о променљивим, методама и конструкторима класе, треба да креирамо објекат класе.public class Guru99ClassObjectCreation {public static void main (String[] args) throws ClassNotFoundException {//1 - By using Class.forname() methodClass c1 = Class.forName("Guru99ClassObjectCreation");//2- By using getClass() methodGuru99ClassObjectCreation guru99Obj = new Guru99ClassObjectCreation();Class c2 = guru99Obj.getClass();//3- By using .classClass c3= Guru99ClassObjectCreation.class;}}
Пример 1: Како доћи до метаподатака класе
Следећи пример показује како доћи до метаподатака као што су: Име класе, име супер класе, имплементирани интерфејси и модификатори приступа класе.
Добићемо метаподатке доњег разреда под називом Гуру99Басе.цласс:
import java.io.Serializable;public abstract class Guru99Base implements Serializable,Cloneable {}
- Назив класе је: Гуру99Басе
- Модификатори приступа су: јавни и апстрактни
- Применио је интерфејсе: Серијализован и Клонибиран
- С обзиром да није експлицитно проширио ниједну класу, супер класа је: јава.ланг.Објецт
import java.lang.reflect.Modifier;public class Guru99GetclassMetaData {public static void main (String [] args) throws ClassNotFoundException {// Create Class object for Guru99Base.classClassguru99ClassObj = Guru99Base.class;// Print name of the classsystem.out.println("Name of the class is : " +guru99ClassObj.getName());// Print Super class namesystem.out.println("Name of the super class is : " +guru99ClassObj.getSuperclass().getName());// Get the list of implemented interfaces in the form of Class array using getInterface() methodclass[] guru99InterfaceList = guru99classObj.getInterfaces();// Print the implemented interfaces using foreach loopsystem.out.print("Implemented interfaces are : ");for (Class guru99class1 : quru99 InterfaceList) {system.out.print guru99class1.getName() + " ");}system.out.println();//Get access modifiers using get Modifiers() method and toString() method of java.lang.reflect.Modifier classint guru99AccessModifier= guru99classObj.getModifiers();// Print the access modifiersSystem.Out.println("Access modifiers of the class are : " +Modifier.tostring(guru99AccessModifier));}}
- исписати име класе методом гетНаме
- Одштампајте име супер класе помоћу методе гетСуперЦласс (). ГетНаме ()
- Одштампајте име имплементираног интерфејса
- Одштампајте модификаторе приступа које користи класа
Пример 2: Како доћи до метаподатака променљиве
Следећи примери показују како доћи до метаподатака променљиве:
Овде креирамо класу под називом Гуру99ВариаблеМетаДата .цласс са неким променљивим:
package guru;public class Guru99VariableMetaData {public static int guru99IntVar1=1111;static int guru99IntVar2=2222;static String guru99StringVar1="guru99.com";static String guru99StringVar2="Learning Reflection API";}Кораци до метаподатака о променљивим у горњој класи:
- Направите објекат класе горе наведене класе, тј. Гуру99ВариаблеМетаДата.цласс као доле:
Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData();Class guru99ClassObjVar = guru99ClassVar.getClass();
- Набавите метаподатке у облику поља са методама гетФиелдс () или гетДецларедФиелдс () као што је приказано испод:
Field[] guru99Field1= guru99ClassObjVar .getFields();Field[] guru99Fiel2= guru99ClassObjVar .getDeclaredFields();
гетФиелдс () метода враћа метаподатке јавне променљиве из наведене класе, као и из њене супер класе.
метода гетДецларедФиелдс () враћа метаподатке свих променљивих само из наведене класе.
- Набавите име променљивих помоћу методе „публиц Стринг гетНаме ()“.
- Набавите тип података променљивих помоћу методе „публиц Цласс гетТипе ()“.
- Добијте вредност променљиве помоћу методе „публиц ккк гет (Фиелд)“.
Овде ккк може бити бајт или кратица било које врсте вредности коју желимо да преузмемо.
- Набавите модификаторе приступа променљивих помоћу метода гетМодифиер () и Модифиер.тоСтринг (инт и).
Овде пишемо класу да бисмо добили метаподатке променљивих присутних у класи Гуру99ВариаблеМетаДата .цласс:
package guru;import java.lang.reflect.Field;public class Guru99VariableMetaDataTest {public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException {// Create Class object for Guru99VariableMetaData.classGuru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData();Class guru99ClassObjVar = guru99ClassVar.getClass();// Get the metadata of all the fields of the class Guru99VariableMetaDataField[] guru99Field1= guru99ClassObjVar.getDeclaredFields();// Print name, datatypes, access modifiers and values of the varibales of the specified classfor(Field field : guru99Field1) {System.out.println("Variable name : "+field.getName());System.out.println("Datatypes of the variable :"+field.getType());int guru99AccessModifiers = field.getModifiers();System.out.printlln("Access Modifiers of the variable : "+Modifier.toString(guru99AccessModifiers));System.out.println("Value of the variable : "+field.get(guru99ClassVar));System.out.println();system.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *") ;}}}
- Направљен објект класе за Гуру99ВариаблеМетаДата.цласс
- Добио сам све метаподатке променљивих у пољу Фиелд
- Штампана су сва имена променљивих у класи Гуру99ВариаблеМетаДата.цласс
- Штампани су сви типови података променљивих у класи Гуру99ВариаблеМетаДата.цласс
- Штампани су сви модификатори приступа променљивих у класи Гуру99ВариаблеМетаДата.цласс
- Штампане вредности свих променљивих у Штампане све врсте података променљивих у класи Гуру99ВариаблеМетаДата.цласс
- Направите објекат класе горе наведене класе, тј. Гуру99МетходМетаДата.цласс као доле:
Guru99MethodMetaData guru99ClassVar = new Guru99MethodMetaData ();Class guru99ClassObjVar = guru99ClassVar.getClass();
- Добијте информације о методи у низу метода помоћу метода гетМетходс () и гетДецларедМетходс () као што је приказано испод:
Method[] guru99 Method 1= guru99ClassObjVar .get Methods();Method [] guru99 Method 2= guru99ClassObjVar .getDeclared Method s();
метода гетМетходс () враћа метаподатке јавних метода из наведене класе, као и из њене супер класе.
метода гетДецларедМетходс () враћа метаподатке свих метода само из наведене класе.
- Добијте име методе помоћу методе гетНаме () .
- Набавите тип повратка методе помоћу методе гетРетурнТипе () .
- Набавите модификаторе приступа методама помоћу метода гетМодифиерс () и Модифиерс.тоСтринг (инт и) .
- Добијте типове параметара методе помоћу методе гетПараметерТипес () која враћа низ класа.
- Добити избачени изузетак помоћу методе гетЕкцептионТипес () која враћа низ класа.
- Направљен објект класе за Гуру99МетходМетаДата.цласс
- Добио сам све метаподатке свих метода у низу метода
- Штампана су сва имена метода присутна у класи Гуру99МетходМетаДата.цласс
- Штампани повратни типови метода у класи Гуру99МетходМетаДата.цласс
- Штампани су сви модификатори приступа метода у класи Гуру99МетходМетаДата.цласс
- Штампани типови параметара метода у Гуру99МетходМетаДата.цласс
- Исписане изузетке бацају методе у Гуру99МетходМетаДата.цласс
- Креирао објект класе за Гуру99Цонструцтор.цласс
- Добио сам све метаподатке свих конструктора у низу Конструктора
- Штампана су сва имена конструктора присутна у класи Гуру99Цонструцтор.цласс
- Исписани сви модификатори приступа конструктора у класи Гуру99Цонструцтор.цласс
- Штампани типови параметара конструктора у Гуру99Цонструцтор.цласс
- Исписане изузетке бацају конструктори у Гуру99Цонструцтор.цласс
- Програмирање рефлексије у јави помаже у проналажењу и модификовању информација о класама и члановима класа, као што су променљиве, методе, конструктори.
- АПИ рефлексије у Јави се може применити помоћу класа у пакету јава.ланг.рефлецт и метода класе јава.ланг.Цласс.
- Неке најчешће коришћене методе класе јава.ланг.Цласс су гетНаме (), гетСуперцласс (), гетИнтерфацес (), гетМодифиерс () итд.
- Неке најчешће коришћене класе у пакету јава.ланг.рефлецт су Фиелд, Метход, Цонструцтор, Модифиер, итд.
- АПИ рефлексије може приступити приватним методама и променљивим класе које могу представљати безбедносну претњу.
- Рефлецтион АПИ је моћна способност коју пружа Јава, али долази са неким опћим трошковима као што су спорије перформансе, сигурносна рањивост и издавање дозвола. Дакле, АПИ рефлексије треба третирати као крајње средство за извођење операције.
Пример 3: Како доћи до метаподатака методе
Следећи примери показују како доћи до метаподатака методе:
Овде креирамо класу под називом Гуру99МетходМетаДата .цласс са неким методама
package guru;import java.sql.SQLException;public class Guru99MethodMetaData {public void guru99Add(int firstElement, int secondElement , String result)throws ClassNotFoundException, ClassCastException{System.out.println("Demo method for Reflextion API");}public String guru99Search(String searchString)throws ArithmeticException, InterruptedException{System.out.println("Demo method for Reflection API");return null;}public void guru99Delete(String deleteString)throws SQLException{System.out.println("Demo method for Reflection API");}}
Кораци за добијање метаподатака о методама у горњој класи:
Овде пишемо класу да бисмо добили метаподатке метода присутних у класи Гуру99МетходМетаДата.цласс:
package guru;import java.lang.reflect.Method;import java.lang.reflect.Modifier;public class Guru99MethodMetaDataTest {public static void main (String[] args) {// Create Class object for Guru99Method MetaData.classclass guru99ClassObj = Guru99MethodMetaData.class;// Get the metadata or information of all the methods of the class using getDeclaredMethods()Method[] guru99Methods=guru99classObj.getDeclaredMethods();for(Method method : guru99Methods) {// Print the method namesSystem.out.println("Name of the method : "+method.getName());// Print return type of the methodsSystem.out.println("Return type of the method : "+method.getReturnType());//Get the access modifier list and printint guru99ModifierList = method.getModifiers();System.Out.printlin ("Method access modifiers : "+Modifier.toString(guru99ModifierList));// Get and print parameters of the methodsClass[] guru99ParamList= method.getParameterTypes();system.out.print ("Method parameter types : ");for (Class class1 : guru99ParamList){System.out.println(class1.getName()+" ");}System.out.println();// Get and print exception thrown by the methodClass[] guru99ExceptionList = method. getExceptionTypes();system.out.print("Excpetion thrown by method :");for (Class class1 : guru99ExceptionList) {System.out.println (class1.getName() +" "):}System.Out.println();system.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ");}}}
Пример 4: Како доћи до метаподатака конструктора
Следећи примери показују како доћи до метаподатака конструктора:
Овде креирамо класу под називом Гуру99Цонструцтор.цласс са различитим конструкторима:
package guru;import java.rmi.RemoteException;import java.sql.SQLException;public class Guru99Constructor {public Guru99Constructor(int no) throws ClassCastException ,ArithmeticException{ }public Guru99Constructor(int no, String name) throws RemoteException ,SQLException{ }public Guru99Constructor(int no, String name, String address) throws InterruptedException{ }}
Овде пишемо класу да бисмо добили метаподатке конструктора присутних у класи Гуру99Цонструцтор.цласс:
package guru;import java.lang.reflect.Constructor;public class Guru99ConstructorMetaDataTest {public static void main (String[] args) {// Create Class object for Guru99Constructor.classClass guru99Class=Guru99Constructor.class;// Get all the constructor information in the Constructor arrayConstructor[] guru99ConstructorList = guru99Class.getConstructors();for (Constructor constructor : guru99ConstructorList) {// Print all name of each constructorSystem.out.println("Constrcutor name : "+constructor.getName());//Get and print access modifiers of each constructorint guru99Modifiers= constructor.getModifiers();System.Out.printlin ("Constrctor modifier : "+Modifier.toString(guru99Modifiers));// Get and print parameter typesClass[] guru99ParamList=constructor.getParameterTypes();System.out.print ("Constrctor parameter types :");for (Class class1 : guru99ParamList) {System.out.println(class1.getName() +" ");}System. out.println();// Get and print exception thrown by constructorsClass[] guru99ExceptionList=constructor.getFxceptionTypes();System.out.println("Exception thrown by constructors :");for (Class class1 : guru99ExceptionList) {System.out.println(class1.getName() +" ");}System.out.println();System.out.println("*******************************************");}}}
Резиме: