„Java Reflection“ API pamoka su pavyzdžiu

Turinys:

Anonim

Kas yra „Java“ atspindys?

„Java Reflection“ yra visų klasės galimybių analizė ir modifikavimas vykdymo metu. „Java Reflection“ API naudojama manipuliuoti klase ir jos nariais, kurie apima laukus, metodus, konstruktorių ir kt. Vykdymo metu.

Vienas „Java“ atspindėjimo API privalumas yra tai, kad jis taip pat gali manipuliuoti privačiais klasės nariais.

Paketas „java.lang.reflect“ suteikia daugybę klasių, kad būtų galima įdiegti atspindį „java“. Klasės „java.lang.Class“ metodai naudojami rinkti visus tam tikros klasės metaduomenis.

Šioje pamokoje sužinosite

  • Kas yra atspindys
  • Klasė java.lang.reflect pakete
  • Java.lang.Class naudojami metodai
  • Kaip gauti išsamią informaciją apie klasę
  • 1 pavyzdys: Kaip gauti klasės metaduomenis
  • 2 pavyzdys: Kaip gauti kintamojo metaduomenis
  • 3 pavyzdys: Kaip gauti metaduomenis
  • 4 pavyzdys: Kaip gauti konstruktorių metaduomenis

Klasė java.lang.reflect pakete

Toliau pateikiamas įvairių Java klasių sąrašas java.lang.package, kad būtų galima įgyvendinti refleksiją-

  • Laukas : ši klasė naudojama rinkti deklaratyvią informaciją, pvz., Duomenų tipą, prieigos modifikatorių, kintamojo pavadinimą ir vertę.
  • Metodas : Ši klasė naudojama rinkti deklaratyvią informaciją, pvz., Prieigos modifikatorių, grąžinimo tipą, pavadinimą, parametrų tipus ir metodo išimties tipą.
  • Konstruktorius : Ši klasė naudojama rinkti deklaratyvią informaciją, pvz., Prieigos modifikatorių, konstruktoriaus pavadinimą ir parametrų tipus.
  • Modifikatorius : ši klasė naudojama rinkti informaciją apie tam tikrą prieigos modifikatorių.

Java.lang.Class naudojami metodai

  • Public String getName () : grąžina klasės pavadinimą.
  • public Class getSuperclass () : pateikia super klasės nuorodą
  • Viešoji klasė [] getInterfaces () : pateikia nurodytų klasės įdiegtų sąsajų masyvą
  • Public in getModifiers (): Pateikia sveiką skaičių, nurodantį nurodytos klasės modifikatorius, kurį reikia perduoti kaip parametrą „ public static String toString (int i)“ metodui, kuris grąžina nurodytos klasės prieigos specifikatorių.

Kaip gauti išsamią informaciją apie klasę

Norėdami gauti informacijos apie klasės kintamuosius, metodus ir konstruktorius, turime sukurti klasės objektą.
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;}}
  • Šiame pavyzdyje parodomi įvairūs klasės „klasės“ objekto kūrimo būdai:
  • 1 pavyzdys: Kaip gauti klasės metaduomenis

    Toliau pateiktame pavyzdyje parodyta, kaip gauti metaduomenis, tokius kaip: klasės pavadinimas, super klasės pavadinimas, įdiegtos sąsajos ir klasės prieigos modifikatoriai.

    Mes gausime žemesnės klasės, pavadintos „Guru99Base.class“, metaduomenis:

    import java.io.Serializable;public abstract class Guru99Base implements Serializable,Cloneable {}
    1. Klasės pavadinimas: Guru99Base
    2. Tai yra prieigos modifikatoriai: vieši ir abstraktūs
    3. Jis įdiegė sąsajas: Serializuojamas ir Klonuojamas
    4. Kadangi jis nepratęsė jokios klasės aiškiai, tai yra super klasė: java.lang.Object
    Žemiau klasėje gausite „Guru99Base.class“ metaduomenis ir juos atsispausdinsite:
    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. atspausdinkite klasės pavadinimą naudodami getName metodą
    2. Naudodamiesi getSuperClass (). GetName () metodu, išspausdinkite super klasės pavadinimą
    3. Atspausdinkite įdiegtų sąsajų pavadinimą
    4. Atspausdinkite klasės naudojamus prieigos modifikatorius

    2 pavyzdys: Kaip gauti kintamojo metaduomenis

    Šie pavyzdžiai rodo, kaip gauti kintamojo metaduomenis:

    Čia mes kuriame klasę pavadinimu Guru99VariableMetaData .class su keliais kintamaisiais:

    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";}
    Veiksmai norint gauti aukščiau nurodytos klasės kintamųjų metaduomenis:
    1. Sukurkite aukščiau nurodytos klasės objektą, ty „Guru99VariableMetaData.class“, kaip nurodyta toliau:
      Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData();Class guru99ClassObjVar = guru99ClassVar.getClass();
    2. Gaukite metaduomenis lauko masyvo forma naudodami „ getFields“ () arba „ getDeclaredFields“ () metodus, kaip nurodyta toliau:
      Field[] guru99Field1= guru99ClassObjVar .getFields();Field[] guru99Fiel2= guru99ClassObjVar .getDeclaredFields();

    metodas getFields () pateikia viešojo kintamojo metaduomenis iš nurodytos klasės ir iš super klasės.

    metodas getDeclaredFields () pateikia visų kintamųjų metaduomenis tik iš nurodytos klasės.

    1. Gaukite kintamųjų pavadinimą naudodami „public String getName ()“ metodą.
    2. Gaukite kintamųjų duomenų tipą naudodami metodą „public class getType ()“.
    3. Gaukite kintamojo vertę naudodami „public xxx get (Field)“ metodą.

      Čia xxx gali būti bet kokio tipo vertės, kurią norime gauti, baitas arba trūkumas.

    4. Gaukite kintamųjų prieigos modifikatorius naudodami getModifier () ir Modifier.toString (int i) metodus.

      Čia mes rašome klasę, kad gautume kintamųjų, esančių klasėje Guru99VariableMetaData .class, metaduomenis:

      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. Sukurtas klasės objektas, skirtas Guru99VariableMetaData.class
      2. Gavote visus lauko masyvo kintamųjų metaduomenis
      3. Atspausdino visus kintamųjų pavadinimus klasėje Guru99VariableMetaData.class
      4. Atspausdino visus kintamųjų duomenų tipus klasėje Guru99VariableMetaData.class
      5. Atspausdino visus „Guru99VariableMetaData.class“ klasės kintamųjų prieigos modifikatorius
      6. Išspausdintos visų kintamųjų reikšmės, esančios „Guru99VariableMetaData.class“ klasės kintamųjų duomenų tipuose.

      3 pavyzdys: Kaip gauti metaduomenis

      Šie pavyzdžiai rodo, kaip gauti metaduomenis:

      Kai kuriais metodais kuriame klasę pavadinimu „Guru99MethodMetaData .class“

      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");}} 

      Veiksmai, norint gauti metaduomenis apie aukščiau paminėtus metodus:

      1. Sukurkite pirmiau nurodytos klasės objektą, ty „Guru99MethodMetaData.class“, kaip nurodyta toliau:
        Guru99MethodMetaData guru99ClassVar = new Guru99MethodMetaData ();Class guru99ClassObjVar = guru99ClassVar.getClass();
      2. Gaukite metodo informaciją iš masyvo, naudodami metodus getMethods () ir getDeclaredMethods (), kaip nurodyta toliau:
        Method[] guru99 Method 1= guru99ClassObjVar .get Methods();Method [] guru99 Method 2= guru99ClassObjVar .getDeclared Method s();

        metodas getMethods () pateikia viešųjų metodų metaduomenis iš nurodytos klasės ir iš savo super klasės.

        metodas getDeclaredMethods () pateikia visų metodų metaduomenis tik iš nurodytos klasės.

      3. Gaukite metodo pavadinimą naudodami metodą getName () .
      4. Gaukite metodo grąžinimo tipą naudodami getReturnType () metodą.
      5. Gaukite metodų prieigos modifikatorius naudodami „ getModifiers ()“ ir „ Modifiers.toString“ (int i) metodus.
      6. Gaukite metodo parametrų tipus naudodami metodą getParameterTypes (), kuris grąžina klasės masyvą.
      7. Gaukite metamą išimtį naudodami metodą getExceptionTypes (), kuris grąžina klasės masyvą.

      Čia rašome klasę, kad gautume metodų, esančių klasėje Guru99MethodMetaData.class, metaduomenis:

      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. Sukurtas klasės objektas, skirtas Guru99MethodMetaData.class
      2. Gavote visus metodų masyvo visų metodų metaduomenis
      3. Atsispausdino visus metodų pavadinimus, esančius klasėje Guru99MethodMetaData.class
      4. Atspausdinti Guru99MethodMetaData.class klasės metodų grąžinimo tipai
      5. Atspausdino visus klasės „Guru99MethodMetaData.class“ metodų prieigos modifikatorius
      6. Atspausdinti Guru99MethodMetaData.class metodų parametrų tipai
      7. Atspausdintos išimtys metamos Guru99MethodMetaData.class metodais

      4 pavyzdys: Kaip gauti konstruktorių metaduomenis

      Šie pavyzdžiai rodo, kaip gauti konstruktorių metaduomenis:

      Čia mes kuriame klasę pavadinimu „Guru99Constructor.class“ su skirtingais konstruktoriais:

      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{ }}

      Čia rašome klasę, kad gautume „Guru99Constructor.class“ klasėje esančių konstruktorių metaduomenis:

      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. Sukurtas klasės objektas, skirtas Guru99Constructor.class
      2. Turite visus konstruktorių metaduomenis „Constructor“ masyve
      3. Atspausdino visus konstruktoriaus vardus, esančius klasėje „Guru99Constructor.class“
      4. Atspausdino visus „Guru99Constructor.class“ klasės konstruktorių prieigos modifikatorius
      5. Atspausdinti konstruktorių parametrų tipai Guru99Constructor.class
      6. Spausdintas išimtis konstruktoriai meta „Guru99Constructor.class“

      Santrauka:

      • Refleksijos programavimas Java padeda gauti ir modifikuoti informaciją apie klases ir klasės narius, tokius kintamuosius, metodus, konstruktorius.
      • „Java“ atspindėjimo API galima įgyvendinti naudojant paketo „java.lang.reflect“ klases ir klasės „java.lang.Class“ metodus.
      • Kai kurie dažniausiai naudojami java.lang.Class metodai yra getName (), getSuperclass (), getInterfaces (), getModifiers () ir kt.
      • Kai kurios java.lang.reflect pakete dažniausiai naudojamos klasės yra „Field“, „Method“, „Constructor“, „Modifier“ ir kt.
      • Reflection API gali pasiekti privačius klasės metodus ir kintamuosius, kurie gali kelti grėsmę saugumui.
      • „Reflection API“ yra galinga „Java“ teikiama galimybė, tačiau ji apima kai kurias pridėtines išlaidas, tokias kaip lėtesnis našumas, saugumo pažeidžiamumas ir leidimų problema. Taigi atspindėjimo API turėtų būti laikoma paskutine operacijos atlikimo priemone.