Vodič za Java Reflection API s primjerom

Sadržaj:

Anonim

Što je Reflection u Javi?

Java Reflection je postupak analize i modificiranja svih mogućnosti klase u vrijeme izvođenja. API refleksije u Javi koristi se za manipulaciju razredom i njezinim članovima koji uključuju polja, metode, konstruktor itd. Tijekom izvođenja.

Jedna od prednosti API-ja za razmišljanje u Javi je što može manipulirati i privatnim članovima klase.

Paket java.lang.reflect nudi mnoge klase za implementaciju refleksije java.Metode klase java.lang.Class koriste se za prikupljanje kompletnih metapodataka određene klase.

U ovom vodiču naučit ćete-

  • Što je Refleksija
  • Predavanje u paketu java.lang.reflect
  • Metode korištene u java.lang.Class
  • Kako dobiti potpune informacije o predavanju
  • Primjer 1: Kako doći do metapodataka klase
  • Primjer 2: Kako doći do metapodataka varijable
  • Primjer 3: Kako doći do metapodataka metode
  • Primjer 4: Kako doći do metapodataka konstruktora

Predavanje u paketu java.lang.reflect

Slijedi popis različitih Java klasa u java.lang.package za implementaciju refleksije-

  • Polje : Ova se klasa koristi za prikupljanje deklarativnih podataka poput tipa podataka, modifikatora pristupa, imena i vrijednosti varijable.
  • Metoda : Ova se klasa koristi za prikupljanje deklarativnih podataka kao što su modifikator pristupa, vrsta povrata, ime, vrste parametara i vrsta iznimke metode.
  • Konstruktor : Ova se klasa koristi za prikupljanje deklarativnih podataka poput modifikatora pristupa, naziva i tipova parametara konstruktora.
  • Modifikator : Ova se klasa koristi za prikupljanje podataka o određenom modifikatoru pristupa.

Metode korištene u java.lang.Class

  • Javni niz getName () : Vraća naziv klase.
  • javna klasa getSuperclass () : Vraća referencu super klase
  • Javna klasa [] getInterfaces () : Vraća niz sučelja koja je implementirala navedena klasa
  • Javno u getModifiers (): Vraća cijelu vrijednost koja predstavlja modifikatore navedene klase koja treba biti proslijeđena kao parametar u metodu " javnog statičkog niza toString (int i)" koja vraća specifikator pristupa za datu klasu.

Kako dobiti potpune informacije o predavanju

Da bismo dobili informacije o varijablama, metodama i konstruktorima klase, moramo stvoriti objekt klase.
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;}}
  • Sljedeći primjer pokazuje različite načine za stvaranje objekta klase "class":
  • Primjer 1: Kako doći do metapodataka klase

    Sljedeći primjer pokazuje kako doći do metapodataka kao što su: Ime klase, naziv super klase, implementirana sučelja i modifikatori pristupa klase.

    Dobit ćemo metapodatke donjeg razreda pod nazivom Guru99Base.class:

    import java.io.Serializable;public abstract class Guru99Base implements Serializable,Cloneable {}
    1. Naziv klase je: Guru99Base
    2. Modifikatori pristupa su: javni i apstraktni
    3. Primijenio je sučelja: seribilna i klonirana
    4. Budući da nije eksplicitno proširio nijednu klasu, super klasa je: java.lang.Object
    Ispod klase dobit će se meta podaci Guru99Base.class i ispisati:
    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. ispisati naziv klase metodom getName
    2. Ispišite ime super klase pomoću metode getSuperClass (). GetName ()
    3. Ispišite naziv implementiranih sučelja
    4. Ispišite modifikatore pristupa koje koristi klasa

    Primjer 2: Kako doći do metapodataka varijable

    Sljedeći primjeri pokazuju kako doći do metapodataka varijable:

    Ovdje stvaramo klasu pod nazivom Guru99VariableMetaData .class s nekim varijablama:

    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";}
    Koraci za dobivanje metapodataka o varijablama u gornjoj klasi:
    1. Stvorite objekt klase gore navedene klase, tj. Guru99VariableMetaData.class kao dolje:
      Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData();Class guru99ClassObjVar = guru99ClassVar.getClass();
    2. Nabavite metapodatke u obliku polja s metodama getFields () ili getDeclaredFields () kao što je prikazano u nastavku:
      Field[] guru99Field1= guru99ClassObjVar .getFields();Field[] guru99Fiel2= guru99ClassObjVar .getDeclaredFields();

    getFields () metoda vraća metapodatke javne varijable iz navedene klase, kao i iz njene super klase.

    metoda getDeclaredFields () vraća metapodatke svih varijabli samo iz navedene klase.

    1. Dohvatite ime varijabli pomoću metode "public String getName ()".
    2. Nabavite tip podataka varijabli pomoću metode "public Class getType ()".
    3. Dobijte vrijednost varijable metodom "public xxx get (Field)".

      Ovdje xxx može biti bajt ili kratica bilo koje vrste vrijednosti koju želimo dohvatiti.

    4. Nabavite modifikatore pristupa varijabla pomoću metoda getModifier () i Modifier.toString (int i).

      Ovdje pišemo klasu da bismo dobili metapodatke varijabli prisutnih u klasi Guru99VariableMetaData .class:

      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. Stvoren objekt klase za Guru99VariableMetaData.class
      2. Dobili smo sve metapodatke varijabli u polju Field
      3. Ispisana sva imena varijabli u klasi Guru99VariableMetaData.class
      4. Ispisane sve vrste podataka varijabli u klasi Guru99VariableMetaData.class
      5. Ispisani svi modifikatori pristupa varijabli u klasi Guru99VariableMetaData.class
      6. Ispisane vrijednosti svih varijabli u Ispisane sve vrste podataka varijabli u klasi Guru99VariableMetaData.class

      Primjer 3: Kako doći do metapodataka metode

      Sljedeći primjeri pokazuju kako doći do metapodataka metode:

      Ovdje stvaramo klasu pod nazivom Guru99MethodMetaData .class s nekim metodama

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

      Koraci za dobivanje metapodataka o metodama u gornjoj klasi:

      1. Stvorite objekt klase gornje klase, tj. Guru99MethodMetaData.class kao dolje:
        Guru99MethodMetaData guru99ClassVar = new Guru99MethodMetaData ();Class guru99ClassObjVar = guru99ClassVar.getClass();
      2. Dohvatite informacije o metodi u polju Method pomoću metoda getMethods () i getDeclaredMethods () kao što je prikazano u nastavku:
        Method[] guru99 Method 1= guru99ClassObjVar .get Methods();Method [] guru99 Method 2= guru99ClassObjVar .getDeclared Method s();

        getMethods () metoda vraća metapodatke javnih metoda iz navedene klase, kao i iz njene super klase.

        getDeclaredMethods () metoda vraća metapodatke svih metoda samo iz navedene klase.

      3. Dohvatite ime metode pomoću metode getName () .
      4. Nabavite vrstu povrata metode pomoću metode getReturnType () .
      5. Nabavite modifikatore pristupa metodama pomoću metoda getModifiers () i Modifiers.toString (int i) .
      6. Dobijte vrste parametara metode pomoću metode getParameterTypes () koja vraća niz klasa.
      7. Dobiti izbačenu iznimku pomoću metode getExceptionTypes () koja vraća niz klasa.

      Ovdje pišemo klasu kako bismo dobili metapodatke metoda prisutnih u klasi Guru99MethodMetaData.class:

      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. Stvoren objekt klase za Guru99MethodMetaData.class
      2. Dobili smo sve metapodatke svih metoda u polju Metoda
      3. Ispisana su sva imena metoda prisutna u klasi Guru99MethodMetaData.class
      4. Ispisani povratni tipovi metoda u klasi Guru99MethodMetaData.class
      5. Ispisani svi modifikatori pristupa metoda u klasi Guru99MethodMetaData.class
      6. Ispisani tipovi parametara metoda u klasi Guru99MethodMetaData.class
      7. Ispisane iznimke bacaju metode u klasi Guru99MethodMetaData.class

      Primjer 4: Kako doći do metapodataka konstruktora

      Sljedeći primjeri pokazuju kako doći do metapodataka konstruktora:

      Ovdje stvaramo klasu pod nazivom Guru99Constructor.class s različitim konstruktorima:

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

      Ovdje pišemo klasu kako bismo dobili metapodatke konstruktora prisutnih u klasi Guru99Constructor.class:

      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. Stvoren objekt klase za Guru99Constructor.class
      2. Dobio sam sve metapodatke svih konstruktora u nizu Konstruktora
      3. Ispisana sva imena konstruktora prisutna u klasi Guru99Constructor.class
      4. Ispisani svi modifikatori pristupa konstruktora u klasi Guru99Constructor.class
      5. Ispisani tipovi parametara konstruktora u Guru99Constructor.class
      6. Ispisane iznimke bacaju konstruktori u Guru99Constructor.class

      Sažetak:

      • Programiranje refleksije u javi pomaže u pronalaženju i modificiranju podataka o klasama i članovima klasa kao što su varijable, metode, konstruktori.
      • API refleksije u Javi može se implementirati pomoću klasa u paketu java.lang.reflect i metoda klase java.lang.Class.
      • Neke najčešće korištene metode klase java.lang.Class su getName (), getSuperclass (), getInterfaces (), getModifiers () itd.
      • Neke najčešće korištene klase u paketu java.lang.reflect su Field, Method, Constructor, Modifier itd.
      • Reflection API može pristupiti privatnim metodama i varijablama klase koje mogu predstavljati sigurnosnu prijetnju.
      • Reflection API je moćna sposobnost koju nudi Java, ali dolazi s nekim općim troškovima kao što su sporije performanse, sigurnosna ranjivost i izdanje dozvola. Stoga bi se API refleksije trebao tretirati kao posljednje sredstvo za izvođenje operacije.