Java Reflection API Tutorial med eksempel

Innholdsfortegnelse:

Anonim

Hva er refleksjon i Java?

Java Reflection er prosessen med å analysere og modifisere alle funksjonene til en klasse ved kjøretid. Reflection API i Java brukes til å manipulere klassen og dens medlemmer som inkluderer felt, metoder, konstruktør, etc. ved kjøretid.

En fordel med refleksjon API i Java er at den også kan manipulere private medlemmer av klassen.

Pakken java.lang.reflect gir mange klasser for å implementere refleksjon java.Metoder for klassen java.lang.Class brukes til å samle hele metadata for en bestemt klasse.

I denne veiledningen vil du lære-

  • Hva er refleksjon
  • Klasse i java.lang.reflect-pakke
  • Metoder som brukes i java.lang.Class
  • Hvordan få fullstendig informasjon om en klasse
  • Eksempel 1: Hvordan få metadata i klasse
  • Eksempel 2: Hvordan få metadata av variabel
  • Eksempel 3: Hvordan få metadata av metoden
  • Eksempel 4: Hvordan få metadata fra konstruktører

Klasse i java.lang.reflect-pakke

Følgende er en liste over forskjellige Java-klasser i java.lang.package for å implementere refleksjon-

  • Felt : Denne klassen brukes til å samle deklarativ informasjon som datatype, tilgangsmodifikator, navn og verdi på en variabel.
  • Metode : Denne klassen brukes til å samle deklarativ informasjon som tilgangsmodifikator, returtype, navn, parametertyper og unntakstype for en metode.
  • Konstruktør : Denne klassen brukes til å samle deklarativ informasjon som tilgangsmodifikator, navn og parametertyper til en konstruktør.
  • Modifier : Denne klassen brukes til å samle informasjon om en bestemt tilgangsmodifier.

Metoder som brukes i java.lang.Class

  • Public String getName () : Returnerer navnet på klassen.
  • public Class getSuperclass () : Returnerer superklassereferansen
  • Offentlig klasse [] getInterfaces () : Returnerer en rekke grensesnitt implementert av den angitte klassen
  • Offentlig i getModifiers (): Returnerer en heltallverdi som representerer modifikatorene for den spesifiserte klassen som må sendes som parameter til " offentlig statisk streng toString (int i)" -metoden som returnerer tilgangsspesifikatoren for den gitte klassen.

Hvordan få fullstendig informasjon om en klasse

For å få informasjon om variabler, metoder og konstruktører for en klasse, må vi lage et objekt av klassen.
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;}}
  • Følgende eksempel viser forskjellige måter å lage objekt av klasse "klasse" på:
  • Eksempel 1: Hvordan få metadata i klasse

    Følgende eksempel viser hvordan du får metadata som: Klassenavn, superklassenavn, implementerte grensesnitt og tilgangsmodifikatorer for en klasse.

    Vi får metadata fra underklassen som heter Guru99Base.class:

    import java.io.Serializable;public abstract class Guru99Base implements Serializable,Cloneable {}
    1. Navnet på klassen er: Guru99Base
    2. Det er tilgangsmodifikatorer: offentlige og abstrakte
    3. Den har implementert grensesnitt: Serialiserbar og klonbar
    4. Siden den ikke har utvidet noen klasse eksplisitt, er den superklassen: java.lang.Object
    Under klassen får du metadataene til Guru99Base.class og skriver dem ut:
    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. skriv ut navnet på klassen ved hjelp av getName-metoden
    2. Skriv ut navnet på superklassen ved hjelp av getSuperClass (). GetName () -metoden
    3. Skriv ut navnet på de implementerte grensesnittene
    4. Skriv ut tilgangsmodifikatorene som brukes av klassen

    Eksempel 2: Hvordan få metadata av variabel

    Følgende eksempler viser hvordan du får metadata av variabelen:

    Her lager vi en klasse som heter Guru99VariableMetaData .class med noen variabler:

    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";}
    Fremgangsmåte for å få metadata om variablene i ovennevnte klasse:
    1. Opprett klasseobjektet til ovennevnte klasse, dvs. Guru99VariableMetaData.class som nedenfor:
      Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData();Class guru99ClassObjVar = guru99ClassVar.getClass();
    2. Få metadata i form av feltmatrise ved hjelp av getFields () eller getDeclaredFields () -metoder som nedenfor:
      Field[] guru99Field1= guru99ClassObjVar .getFields();Field[] guru99Fiel2= guru99ClassObjVar .getDeclaredFields();

    getFields () -metoden returnerer metadata for den offentlige variabelen fra den angitte klassen så vel som fra superklassen .

    getDeclaredFields () -metoden returnerer kun metadata for alle variablene fra den angitte klassen.

    1. Få navnet på variablene ved hjelp av "public String getName ()" -metoden.
    2. Få datatypen til variablene ved å bruke "public Class getType ()" -metoden.
    3. Få verdien av variabelen ved hjelp av "public xxx get (Field)" -metoden.

      Her kan xxx være en byte eller kort av hvilken som helst type verdi vi vil hente.

    4. Få tilgangsmodifikatorer for variablene ved hjelp av getModifier () og Modifier.toString (int i) -metodene.

      Her skriver vi en klasse for å få metadataene til variablene som er tilstede i klassen 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. Opprettet klasseobjekt for Guru99VariableMetaData.class
      2. Fikk alle metadataene til variablene i en feltoppstilling
      3. Trykket alle variabelnavnene i klassen Guru99VariableMetaData.class
      4. Trykt ut alle datatypene til variablene i klassen Guru99VariableMetaData.class
      5. Trykket alle tilgangsmodifikatorene til variablene i klassen Guru99VariableMetaData.class
      6. Trykte verdier av alle variablene i Trykt alle datatypene til variablene i klassen Guru99VariableMetaData.class

      Eksempel 3: Hvordan få metadata av metoden

      Følgende eksempler viser hvordan du får metadata av en metode:

      Her lager vi en klasse som heter Guru99MethodMetaData .class med noen metoder

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

      Fremgangsmåte for å få metadata om metodene i ovennevnte klasse:

      1. Opprett klasseobjektet til ovennevnte klasse, dvs. Guru99MethodMetaData.class som nedenfor:
        Guru99MethodMetaData guru99ClassVar = new Guru99MethodMetaData ();Class guru99ClassObjVar = guru99ClassVar.getClass();
      2. Få metodeinformasjon i en metodearray ved hjelp av getMethods () og getDeclaredMethods () -metoden som nedenfor:
        Method[] guru99 Method 1= guru99ClassObjVar .get Methods();Method [] guru99 Method 2= guru99ClassObjVar .getDeclared Method s();

        getMethods () -metoden returnerer metadata for de offentlige metodene fra den angitte klassen så vel som fra superklassen.

        getDeclaredMethods () -metoden returnerer kun metadata for alle metodene fra den angitte klassen.

      3. Få navnet på metoden ved hjelp av getName () -metoden.
      4. returtypen til metoden ved hjelp av getReturnType () -metoden.
      5. Få tilgangsmodifikatorer av metodene ved hjelp av getModifiers () og Modifiers.toString (int i) -metodene.
      6. metodeparametertyper ved hjelp av getParameterTypes () -metoden som returnerer en klassematrise.
      7. Bli kastet unntak ved hjelp av getExceptionTypes () -metoden som returnerer en klassematrise.

      Her skriver vi en klasse for å få metadataene til metodene som er tilstede i klassen 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. Opprettet klasseobjekt for Guru99MethodMetaData.class
      2. Fikk alle metadataene til alle metodene i en Method-matrise
      3. Trykket alle metodenavnene som er tilstede i klassen Guru99MethodMetaData.class
      4. Trykte returtyper av metodene i klassen Guru99MethodMetaData.class
      5. Trykket alle tilgangsmodifikatorene for metodene i klassen Guru99MethodMetaData.class
      6. Trykte parametertyper av metodene i Guru99MethodMetaData.class
      7. Trykte unntak kastes etter metoder i Guru99MethodMetaData.class

      Eksempel 4: Hvordan få metadata fra konstruktører

      Følgende eksempler viser hvordan man får metadata fra konstruktører:

      Her lager vi en klasse som heter Guru99Constructor.class med forskjellige konstruktører:

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

      Her skriver vi en klasse for å få metadataene til konstruktørene som er tilstede i klassen 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. Opprettet klasseobjekt for Guru99Constructor.class
      2. Fikk alle metadataene til alle konstruktørene i en Constructor-serie
      3. Trykket alle konstruktørens navn som er tilstede i klassen Guru99Constructor.class
      4. Trykt alle tilgangsmodifikatorer til konstruktørene i klassen Guru99Constructor.class
      5. Trykte parametertyper av konstruktørene i Guru99Constructor.class
      6. Trykte unntak kastes av konstruktører i Guru99Constructor.class

      Sammendrag:

      • Refleksjonsprogrammering i java hjelper til med å hente og endre informasjon om klasser og klassemedlemmer, slik variabel, metoder, konstruktører.
      • Reflection API i Java kan implementeres ved bruk av klasser i java.lang.reflect-pakken og metoder for java.lang.Class-klassen.
      • Noen vanlige metoder for java.lang.Class-klassen er getName (), getSuperclass (), getInterfaces (), getModifiers () etc.
      • Noen vanlige klasser i java.lang.reflect-pakken er felt, metode, konstruktør, modifikator osv.
      • Reflection API har tilgang til private metoder og variabler i en klasse som kan være en sikkerhetstrussel.
      • Reflection API er en kraftig funksjon som tilbys av Java, men den kommer med noen overhead som tregere ytelse, sikkerhetssårbarhet og tillatelsesproblem. Derfor bør refleksjon API behandles som siste utvei for å utføre en operasjon.