Java Reflection API juhendaja koos näitega

Lang L: none (table-of-contents):

Anonim

Mis on peegeldus Java-s?

Java Reflection on käitamise ajal klassi kõigi võimaluste analüüsimine ja muutmine. Reflection API-d Java-s kasutatakse klassi ja selle liikmete manipuleerimiseks, mis hõlmavad väljad, meetodid, konstruktor jne.

Java peegeldus-API üks eelis on see, et see suudab manipuleerida ka klassi eraliikmetega.

Pakett java.lang.reflect pakub arvukaid klasse peegeldava java rakendamiseks. Klassi java.lang.Class meetodeid kasutatakse konkreetse klassi täielike metaandmete kogumiseks.

Selles õpetuses saate teada

  • Mis on peegeldus
  • Klass paketis java.lang.reflect
  • Jaavas.lang.Class kasutatud meetodid
  • Kuidas saada klassi kohta täielikku teavet
  • Näide 1: Kuidas saada klassi metaandmeid
  • Näide 2: Kuidas saada muutuja metaandmeid
  • Näide 3: Kuidas saada meetodi metaandmeid
  • Näide 4: Kuidas saada ehitajate metaandmeid

Klass paketis java.lang.reflect

Järgnevalt on toodud java.lang.package Java-klasside loetelu peegeldus-

  • Väli : seda klassi kasutatakse deklaratiivse teabe kogumiseks, näiteks andmetüüp, juurdepääsu modifikaator, muutuja nimi ja väärtus.
  • Meetod : seda klassi kasutatakse deklaratiivse teabe kogumiseks, näiteks juurdepääsu modifikaator, tagastuse tüüp, nimi, parameetri tüübid ja meetodi erandi tüüp.
  • Konstruktor : seda klassi kasutatakse deklaratiivse teabe kogumiseks, näiteks juurdepääsu modifikaator, konstruktori nimi ja parameetritüübid.
  • Muutja : seda klassi kasutatakse konkreetse juurdepääsumuunduri kohta teabe kogumiseks.

Jaavas.lang.Class kasutatud meetodid

  • Public String getName () : tagastab klassi nime.
  • public Class getSuperclass () : tagastab superklassi viite
  • Avalik klass [] getInterfaces () : tagastab määratud klassi juurutatud liideste massiivi
  • Public in getModifiers (): tagastab täisarvu, mis tähistab määratud klassi modifikaatoreid ja mis tuleb parameetrina edastada meetodile " public static String toString (int i)", mis tagastab antud klassi juurdepääsu täpsustaja.

Kuidas saada klassi kohta täielikku teavet

Klassi muutujate, meetodite ja konstruktorite kohta teabe saamiseks peame looma klassi objekti.
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;}}
  • Järgmine näide näitab erinevaid võimalusi klassi "klass" objekti loomiseks:
  • Näide 1: Kuidas saada klassi metaandmeid

    Järgmine näide näitab, kuidas hankida metaandmeid, näiteks: klassi nimi, super klassi nimi, rakendatud liidesed ja klassi juurdepääsumuundurid.

    Saame allpool klassi nimega Guru99Base.class metaandmed:

    import java.io.Serializable;public abstract class Guru99Base implements Serializable,Cloneable {}
    1. Kursuse nimi on: Guru99Base
    2. Selle juurdepääsu modifikaatorid on: avalikud ja abstraktsed
    3. Sellel on kasutusel liidesed: serialiseeritav ja kloonitav
    4. Kuna see pole ühtegi klassi sõnaselgelt laiendanud, on see superklass: java.lang.Object
    Klassist allpool saavad Guru99Base.class metaandmed ja printivad need:
    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. printige klassi nimi getName meetodi abil
    2. Prindige superklassi nimi, kasutades meetodit getSuperClass (). GetName ()
    3. Trükige rakendatud liideste nimi
    4. Trükkige klassi kasutatavad juurdepääsumuundurid

    Näide 2: Kuidas saada muutuja metaandmeid

    Järgmised näited näitavad, kuidas saada muutuja metaandmeid:

    Siin loome klassi muutujaga nimega Guru99VariableMetaData .class:

    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";}
    Sammud ülaltoodud klassi muutujate metaandmete saamiseks:
    1. Looge ülaltoodud klassi klassiobjekt, st Guru99VariableMetaData.class nagu allpool:
      Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData();Class guru99ClassObjVar = guru99ClassVar.getClass();
    2. Hankige metaandmed välja massiivi kujul, kasutades meetodeid getFields () või getDeclaredFields (), nagu allpool:
      Field[] guru99Field1= guru99ClassObjVar .getFields();Field[] guru99Fiel2= guru99ClassObjVar .getDeclaredFields();

    meetod getFields () tagastab avaliku klassi muutuja metaandmed nii määratud klassist kui ka selle superklassist.

    meetod getDeclaredFields () tagastab kõigi määratud klassi muutujate metaandmed.

    1. Muutujate hankimiseks kasutage meetodit "public String getName ()".
    2. Hankige muutujate andmetüüp, kasutades meetodit "public Class getType ()".
    3. Hangi muutuja väärtus, kasutades meetodit "public xxx get (Field)".

      Siin võib xxx olla bait või lühike mis tahes tüüpi väärtusest, mida soovime tuua.

    4. Hankige muutujate juurdepääsu modifikaatorid meetodite getModifier () ja Modifier.toString (int i) abil.

      Siinkohal kirjutame klassi, et saada klassis Guru99VariableMetaData .class esinevate muutujate metaandmed:

      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. Lõi klassi Guru99VariableMetaData.class klassiobjekti
      2. Sai kõik muutujate metaandmed välja massiivis
      3. Trükkis kõik klassi Guru99VariableMetaData.class muutujate nimed
      4. Trükkis klassi Guru99VariableMetaData.class muutujate kõik andmetüübid
      5. Trükkis kõik klassi Guru99VariableMetaData.class muutujate juurdepääsu modifikaatorid
      6. Kõigi muutujate prinditud väärtused jaotises Prinditud klassi Guru99VariableMetaData.class muutujate kõik andmetüübid

      Näide 3: Kuidas saada meetodi metaandmeid

      Järgmised näited näitavad, kuidas meetodi metaandmeid hankida:

      Siin loome mõne meetodiga klassi nimega 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");}} 

      Sammud ülaltoodud klassi meetodite metaandmete saamiseks:

      1. Looge ülaltoodud klassi klassiobjekt, st Guru99MethodMetaData.class nagu allpool:
        Guru99MethodMetaData guru99ClassVar = new Guru99MethodMetaData ();Class guru99ClassObjVar = guru99ClassVar.getClass();
      2. Hankige meetoditeave massiivi meetodist, kasutades meetodeid getMethods () ja getDeclaredMethods (), nagu allpool:
        Method[] guru99 Method 1= guru99ClassObjVar .get Methods();Method [] guru99 Method 2= guru99ClassObjVar .getDeclared Method s();

        meetod getMethods () tagastab avalike meetodite metaandmed nii määratud klassist kui ka selle superklassist.

        meetod getDeclaredMethods () tagastab kõigi määratud metoodika metaandmed.

      3. Hankige meetodi nimi, kasutades meetodit getName () .
      4. Hankige meetodi tagastustüüp, kasutades meetodit getReturnType () .
      5. Hankige meetodite juurdepääsu modifikaatorid, kasutades meetodeid getModifiers () ja Modifiers.toString (int i) .
      6. Hankige meetodi parameetrite tüübid, kasutades meetodit getParameterTypes (), mis tagastab klassi massiivi.
      7. Hangi visatud erand, kasutades meetodit getExceptionTypes (), mis tagastab klassi massiivi.

      Siinkohal kirjutame klassi, et saada klassis Guru99MethodMetaData.class esinevate meetodite metaandmed:

      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. Lõi klassi Guru99MethodMetaData.class klassiobjekti
      2. Sai massiivi Method kõik metaandmed
      3. Trükkis kõik klassis Guru99MethodMetaData.class esinevad meetodinimed
      4. Prinditud tagastustüübid klassis Guru99MethodMetaData.class
      5. Trükkis klassi Guru99MethodMetaData.class meetodite kõik juurdepääsu modifikaatorid
      6. Prinditud parameetrite tüübid meetodis Guru99MethodMetaData.class
      7. Trükitud erandid visatakse meetoditega Guru99MethodMetaData.class

      Näide 4: Kuidas saada ehitajate metaandmeid

      Järgmised näited näitavad, kuidas hankida konstruktorite metaandmeid:

      Siin loome erinevate konstruktoritega klassi nimega Guru99Constructor.class:

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

      Siinkohal kirjutame klassi, et saada klassis Guru99Constructor.class olevate konstruktorite metaandmed:

      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. Lõi klassi Guru99Constructor.class klassiobjekti
      2. Saite massi Constructor kõigi konstruktorite kõik metaandmed
      3. Trükkis kõik klassis Guru99Constructor.class olevad konstruktorite nimed
      4. Trükkis klassi Guru99Constructor.class kõik konstruktorite juurdepääsu modifikaatorid
      5. Konstruktorite prinditud parameetrite tüübid saidil Guru99Constructor.class
      6. Trükitud erandeid viskavad ehitajad Guru99Constructor.class

      Kokkuvõte:

      • Peegeldamise programmeerimine javas aitab hankida ja muuta teavet klasside ja klassiliikmete kohta, näiteks muutuja, meetodid, konstruktorid.
      • Peegeldamise API Java-s saab rakendada paketis java.lang.reflect olevate klasside ja klassi java.lang.Class meetodite abil.
      • Mõned tavaliselt kasutatavad java.lang.Class-i meetodid on getName (), getSuperclass (), getInterfaces (), getModifiers () jne.
      • Mõned paketis java.lang.reflect tavaliselt kasutatavad klassid on Field, Method, Constructor, Modifier jne.
      • Reflection API-l on juurdepääs klassi privaatsetele meetoditele ja muutujatele, mis võivad olla turvalisuse ohuks.
      • Reflection API on Java pakutav võimas võimalus, kuid sellega kaasnevad mõned üldkulud, näiteks aeglasem jõudlus, turvanõrkus ja lubade probleem. Seetõttu tuleks peegelduse API-d käsitleda operatsiooni sooritamise viimase abinõuna.