Java Reflection -sovellusliittymän opetusohjelma esimerkillä

Sisällysluettelo:

Anonim

Mikä on Java-pohdinta?

Java Reflection on luokan kaikkien ominaisuuksien analysointi ja muokkaus ajon aikana. Reflection API in Java -ohjelmaa käytetään luokan ja sen jäsenten manipulointiin, jotka sisältävät kenttiä, menetelmiä, konstruktoria jne. Ajon aikana.

Yksi Java-heijastussovellusliittymän etu on, että se voi myös manipuloida luokan yksityisiä jäseniä.

Java.lang.reflect-paketti tarjoaa monia luokkia pohdinnan java toteuttamiseksi.Java.lang.Class-luokan menetelmiä käytetään tietyn luokan täydellisten metatietojen keräämiseen.

Tässä opetusohjelmassa opit-

  • Mikä on heijastus
  • Luokka java.lang.reflect-paketissa
  • Java.lang.Classissa käytetyt menetelmät
  • Kuinka saada täydellistä tietoa luokasta
  • Esimerkki 1: Kuinka hankkia luokan metatiedot
  • Esimerkki 2: Kuinka saada muuttujan metatiedot
  • Esimerkki 3: Menetelmän metatietojen saaminen
  • Esimerkki 4: Kuinka hankkia rakentajien metatiedot

Luokka java.lang.reflect-paketissa

Seuraavassa on luettelo Java-luokista java.lang.package-sovelluksessa pohdinta-

  • Kenttä : Tätä luokkaa käytetään keräämään vakuuttavia tietoja, kuten tietotyyppi, käyttöoikeuden muokkaaja, muuttujan nimi ja arvo.
  • Menetelmä : Tätä luokkaa käytetään keräämään vakuuttavia tietoja, kuten pääsyn muokkaus, palautustyyppi, nimi, parametrityypit ja menetelmän poikkeustyyppi.
  • Rakentaja : Tätä luokkaa käytetään keräämään vakuuttavia tietoja, kuten pääsynmuokkaaja, rakentajan nimi ja parametrityypit.
  • Muokkaaja : Tätä luokkaa käytetään keräämään tietoja tietystä pääsynmuuttajasta.

Java.lang.Classissa käytetyt menetelmät

  • Public String getName () : Palauttaa luokan nimen.
  • public Class getSuperclass () : Palauttaa superluokan viitteen
  • Julkinen luokka [] getInterfaces () : Palauttaa joukon rajapintoja, jotka määritetty luokka toteuttaa
  • Public in getModifiers (): Palauttaa kokonaisluvun, joka edustaa määritetyn luokan muokkaajia ja joka on välitettävä parametrina " public static String toString (int i)" -menetelmään, joka palauttaa tietylle luokalle pääsyn määrittelijän.

Kuinka saada täydellistä tietoa luokasta

Saadaksesi tietoa luokan muuttujista, menetelmistä ja rakentajista meidän on luotava luokan 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;}}
  • Seuraava esimerkki näyttää erilaisia ​​tapoja luoda luokan "luokka" objekti:
  • Esimerkki 1: Kuinka hankkia luokan metatiedot

    Seuraava esimerkki osoittaa, kuinka hankitaan metatietoja, kuten: luokan nimi, superluokan nimi, toteutetut käyttöliittymät ja luokan käyttömuokkaajat.

    Saamme alla olevan luokan Guru99Base.class metatiedot:

    import java.io.Serializable;public abstract class Guru99Base implements Serializable,Cloneable {}
    1. Luokan nimi on: Guru99Base
    2. Sen käyttömuokkaajat ovat: julkisia ja abstrakteja
    3. Se on toteuttanut käyttöliittymiä: Serialisoitavissa ja Cloneable
    4. Koska se ei ole nimenomaisesti laajentanut yhtään luokkaa, se on superluokka: java.lang.Object
    Luokan alapuolella saat Guru99Base.classin metatiedot ja tulostaa ne:
    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. tulosta luokan nimi getName-menetelmällä
    2. Tulosta superluokan nimi getSuperClass (). GetName () -menetelmällä
    3. Tulosta toteutettujen rajapintojen nimi
    4. Tulosta luokan käyttämät pääsymuuttujat

    Esimerkki 2: Kuinka saada muuttujan metatiedot

    Seuraavat esimerkit osoittavat, kuinka muuttujan metatiedot saadaan:

    Tässä luomme luokan nimeltä Guru99VariableMetaData .class muutamilla muuttujilla:

    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";}
    Vaiheet metatietojen saamiseksi yllä olevan luokan muuttujista:
    1. Luo yllä olevan luokan luokkaobjekti eli Guru99VariableMetaData.class seuraavasti:
      Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData();Class guru99ClassObjVar = guru99ClassVar.getClass();
    2. Hanki metatiedot kenttäryhmän muodossa käyttämällä getFields () - tai getDeclaredFields () -menetelmiä seuraavasti:
      Field[] guru99Field1= guru99ClassObjVar .getFields();Field[] guru99Fiel2= guru99ClassObjVar .getDeclaredFields();

    getFields () -menetelmä palauttaa julkisen muuttujan metatiedot sekä määritetystä luokasta että sen superluokasta .

    getDeclaredFields () -menetelmä palauttaa kaikkien määritettyjen luokkien muuttujien metatiedot.

    1. Hanki muuttujien nimi käyttämällä "public String getName ()" -menetelmää.
    2. Hanki muuttujien tietotyyppi käyttämällä "public Class getType ()" -menetelmää.
    3. Hanki muuttujan arvo käyttämällä "public xxx get (Field)" -menetelmää.

      Tässä xxx voi olla tavu tai lyhyt minkä tahansa tyyppisestä arvosta, jonka haluamme hakea.

    4. Hanki muuttujien käyttömuokkaajat getModifier () - ja Modifier.toString (int i) -menetelmillä.

      Tässä kirjoitamme luokan saadaksemme luokan Guru99VariableMetaData .class muuttujien metatiedot:

      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. Luonut luokan objektin Guru99VariableMetaData.classille
      2. Sait kaikki muuttujien metatiedot Field-taulukossa
      3. Tulosti kaikki luokan Guru99VariableMetaData.class muuttujien nimet
      4. Tulosti kaikki muuttujien tietotyypit luokassa Guru99VariableMetaData.class
      5. Tulosti kaikki luokan Guru99VariableMetaData.class muuttujien käyttömuokkaajat
      6. Kaikkien muuttujien tulostetut arvot kohdassa Tulostetut luokan Guru99VariableMetaData.class muuttujien kaikki tietotyypit

      Esimerkki 3: Menetelmän metatietojen saaminen

      Seuraavat esimerkit osoittavat, miten menetelmän metatiedot saadaan:

      Tässä luomme luokan nimeltä Guru99MethodMetaData .class joillakin menetelmillä

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

      Vaiheet metatietojen saamiseksi yllä olevan luokan menetelmistä:

      1. Luo yllä olevan luokan luokkaobjekti eli Guru99MethodMetaData.class kuten alla:
        Guru99MethodMetaData guru99ClassVar = new Guru99MethodMetaData ();Class guru99ClassObjVar = guru99ClassVar.getClass();
      2. Hanki menetelmätiedot Method-taulukosta käyttämällä getMethods () - ja getDeclaredMethods () -menetelmiä seuraavasti:
        Method[] guru99 Method 1= guru99ClassObjVar .get Methods();Method [] guru99 Method 2= guru99ClassObjVar .getDeclared Method s();

        getMethods () -menetelmä palauttaa julkisten menetelmien metatiedot sekä määritetystä luokasta että sen superluokasta .

        getDeclaredMethods () -menetelmä palauttaa kaikkien määritettyjen luokkien metodien metatiedot.

      3. Hanki menetelmän nimi getName () -menetelmällä.
      4. Hanki menetelmän palautustyyppi getReturnType () -menetelmällä.
      5. Hanki menetelmien käyttömuokkaajat getModifiers () - ja Modifiers.toString (int i) -menetelmillä.
      6. Hanki menetelmäparametrityypit getParameterTypes () -menetelmällä, joka palauttaa luokan taulukon.
      7. Hanki heitetty poikkeus getExceptionTypes () -menetelmällä, joka palauttaa luokan taulukon.

      Tässä kirjoitamme luokan saadaksemme luokan Guru99MethodMetaData.class metatiedot:

      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. Luonut luokan objektin kohteelle Guru99MethodMetaData.class
      2. Sait kaikki metatiedot kaikista menetelmistä taulukossa Method
      3. Tulosti kaikki luokan Guru99MethodMetaData.class metodien nimet
      4. Luokan Guru99MethodMetaData.class menetelmien tulostetut palautustyypit
      5. Tulosti kaikki Guru99MethodMetaData.class-luokan menetelmien käyttömuokkaajat
      6. Tulostetut Guru99MethodMetaData.class-menetelmien parametrityypit
      7. Tulostetut poikkeukset heitetään menetelmillä Guru99MethodMetaData.class

      Esimerkki 4: Kuinka hankkia rakentajien metatiedot

      Seuraavat esimerkit osoittavat, miten saat rakennuttajien metatiedot:

      Tässä luomme luokan nimeltä Guru99Constructor.class eri rakentajilla:

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

      Tässä kirjoitamme luokan saadaksemme luokan Guru99Constructor.class rakentajien metatiedot:

      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. Luonut luokan objektin Guru99Constructor.classille
      2. Sait kaikki konstruktorien metatiedot Constructor-taulukossa
      3. Tulosti kaikki rakentajan nimet luokassa Guru99Constructor.class
      4. Tulosti kaikki Guru99Constructor.class-luokan rakentajien käyttömuokkaajat
      5. Rakentajien tulostetut parametrityypit Guru99Constructor.classissa
      6. Rakentajat heittävät painetut poikkeukset Guru99Constructor.class-kansioon

      Yhteenveto:

      • Jaavan heijastusohjelmointi auttaa noutamaan ja muokkaamaan tietoja luokista ja luokan jäsenistä, kuten muuttujasta, menetelmistä, konstruktoreista.
      • Reflection API Java: ssa voidaan toteuttaa käyttämällä java.lang.reflect-paketin luokkia ja java.lang.Class-luokan menetelmiä.
      • Joitakin java.lang.Class-luokan yleisesti käytettyjä menetelmiä ovat getName (), getSuperclass (), getInterfaces (), getModifiers () jne.
      • Joitakin java.lang.reflect-paketissa yleisesti käytettyjä luokkia ovat Field, Method, Constructor, Modifier jne.
      • Reflection API voi käyttää luokan yksityisiä menetelmiä ja muuttujia, jotka voivat olla tietoturvauhkia.
      • Reflection API on Java: n tarjoama tehokas ominaisuus, mutta siihen sisältyy joitain yleiskustannuksia, kuten hitaampi suorituskyky, tietoturva-aukko ja lupakysymykset. Siksi heijastussovellusliittymää tulisi pitää viimeisenä keinona suorittaa toimenpide.