Водич за Јава Рефлецтион АПИ са примером

Преглед садржаја:

Anonim

Шта је Рефлецтион у Јави?

Јава Рефлецтион је процес анализе и модификовања свих могућности класе током извођења. АПИ рефлексије у Јави се користи за манипулисање класом и њеним члановима који укључују поља, методе, конструктор итд. Током извођења.

Једна од предности АПИ-ја за размишљање у Јави је што може да манипулише и приватним члановима класе.

Пакет јава.ланг.рефлецт пружа многе класе за имплементацију рефлексије јава.Методе класе јава.ланг.Цласс се користе за прикупљање комплетних метаподатака одређене класе.

У овом упутству ћете научити-

  • Шта је Рефлексија
  • Предавање у пакету јава.ланг.рефлецт
  • Методе коришћене у јава.ланг.Цласс
  • Како добити потпуне информације о предавању
  • Пример 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 {}
    1. Назив класе је: Гуру99Басе
    2. Модификатори приступа су: јавни и апстрактни
    3. Применио је интерфејсе: Серијализован и Клонибиран
    4. С обзиром да није експлицитно проширио ниједну класу, супер класа је: јава.ланг.Објецт
    Испод класе ће се добити мета подаци Гуру99Басе.цласс и исписати:
    import java.lang.reflect.Modifier;public class Guru99GetclassMetaData {public static void main (String [] args) throws ClassNotFoundException {// Create Class object for Guru99Base.classClass  guru99ClassObj = 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));}} 
    1. исписати име класе методом гетНаме
    2. Одштампајте име супер класе помоћу методе гетСуперЦласс (). ГетНаме ()
    3. Одштампајте име имплементираног интерфејса
    4. Одштампајте модификаторе приступа које користи класа

    Пример 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";}
    Кораци до метаподатака о променљивим у горњој класи:
    1. Направите објекат класе горе наведене класе, тј. Гуру99ВариаблеМетаДата.цласс као доле:
      Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData();Class guru99ClassObjVar = guru99ClassVar.getClass();
    2. Набавите метаподатке у облику поља са методама гетФиелдс () или гетДецларедФиелдс () као што је приказано испод:
      Field[] guru99Field1= guru99ClassObjVar .getFields();Field[] guru99Fiel2= guru99ClassObjVar .getDeclaredFields();

    гетФиелдс () метода враћа метаподатке јавне променљиве из наведене класе, као и из њене супер класе.

    метода гетДецларедФиелдс () враћа метаподатке свих променљивих само из наведене класе.

    1. Набавите име променљивих помоћу методе „публиц Стринг гетНаме ()“.
    2. Набавите тип података променљивих помоћу методе „публиц Цласс гетТипе ()“.
    3. Добијте вредност променљиве помоћу методе „публиц ккк гет (Фиелд)“.

      Овде ккк може бити бајт или кратица било које врсте вредности коју желимо да преузмемо.

    4. Набавите модификаторе приступа променљивих помоћу метода гетМодифиер () и Модифиер.тоСтринг (инт и).

      Овде пишемо класу да бисмо добили метаподатке променљивих присутних у класи Гуру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("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *") ;}}}
      1. Направљен објект класе за Гуру99ВариаблеМетаДата.цласс
      2. Добио сам све метаподатке променљивих у пољу Фиелд
      3. Штампана су сва имена променљивих у класи Гуру99ВариаблеМетаДата.цласс
      4. Штампани су сви типови података променљивих у класи Гуру99ВариаблеМетаДата.цласс
      5. Штампани су сви модификатори приступа променљивих у класи Гуру99ВариаблеМетаДата.цласс
      6. Штампане вредности свих променљивих у Штампане све врсте података променљивих у класи Гуру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");}} 

      Кораци за добијање метаподатака о методама у горњој класи:

      1. Направите објекат класе горе наведене класе, тј. Гуру99МетходМетаДата.цласс као доле:
        Guru99MethodMetaData guru99ClassVar = new Guru99MethodMetaData ();Class guru99ClassObjVar = guru99ClassVar.getClass();
      2. Добијте информације о методи у низу метода помоћу метода гетМетходс () и гетДецларедМетходс () као што је приказано испод:
        Method[] guru99 Method 1= guru99ClassObjVar .get Methods();Method [] guru99 Method 2= guru99ClassObjVar .getDeclared Method s();

        метода гетМетходс () враћа метаподатке јавних метода из наведене класе, као и из њене супер класе.

        метода гетДецларедМетходс () враћа метаподатке свих метода само из наведене класе.

      3. Добијте име методе помоћу методе гетНаме () .
      4. Набавите тип повратка методе помоћу методе гетРетурнТипе () .
      5. Набавите модификаторе приступа методама помоћу метода гетМодифиерс () и Модифиерс.тоСтринг (инт и) .
      6. Добијте типове параметара методе помоћу методе гетПараметерТипес () која враћа низ класа.
      7. Добити избачени изузетак помоћу методе гетЕкцептионТипес () која враћа низ класа.

      Овде пишемо класу да бисмо добили метаподатке метода присутних у класи Гуру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("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ");}}}
      1. Направљен објект класе за Гуру99МетходМетаДата.цласс
      2. Добио сам све метаподатке свих метода у низу метода
      3. Штампана су сва имена метода присутна у класи Гуру99МетходМетаДата.цласс
      4. Штампани повратни типови метода у класи Гуру99МетходМетаДата.цласс
      5. Штампани су сви модификатори приступа метода у класи Гуру99МетходМетаДата.цласс
      6. Штампани типови параметара метода у Гуру99МетходМетаДата.цласс
      7. Исписане изузетке бацају методе у Гуру99МетходМетаДата.цласс

      Пример 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("*******************************************");}}}
      1. Креирао објект класе за Гуру99Цонструцтор.цласс
      2. Добио сам све метаподатке свих конструктора у низу Конструктора
      3. Штампана су сва имена конструктора присутна у класи Гуру99Цонструцтор.цласс
      4. Исписани сви модификатори приступа конструктора у класи Гуру99Цонструцтор.цласс
      5. Штампани типови параметара конструктора у Гуру99Цонструцтор.цласс
      6. Исписане изузетке бацају конструктори у Гуру99Цонструцтор.цласс

      Резиме:

      • Програмирање рефлексије у јави помаже у проналажењу и модификовању информација о класама и члановима класа, као што су променљиве, методе, конструктори.
      • АПИ рефлексије у Јави се може применити помоћу класа у пакету јава.ланг.рефлецт и метода класе јава.ланг.Цласс.
      • Неке најчешће коришћене методе класе јава.ланг.Цласс су гетНаме (), гетСуперцласс (), гетИнтерфацес (), гетМодифиерс () итд.
      • Неке најчешће коришћене класе у пакету јава.ланг.рефлецт су Фиелд, Метход, Цонструцтор, Модифиер, итд.
      • АПИ рефлексије може приступити приватним методама и променљивим класе које могу представљати безбедносну претњу.
      • Рефлецтион АПИ је моћна способност коју пружа Јава, али долази са неким опћим трошковима као што су спорије перформансе, сигурносна рањивост и издавање дозвола. Дакле, АПИ рефлексије треба третирати као крајње средство за извођење операције.