Java Reflection API-zelfstudie met voorbeeld

Inhoudsopgave:

Anonim

Wat is reflectie in Java?

Java Reflection is het proces van het analyseren en wijzigen van alle mogelijkheden van een klasse tijdens runtime. Reflection API in Java wordt gebruikt om klassen en zijn leden, waaronder velden, methoden, constructor, enz., Tijdens runtime te manipuleren.

Een voordeel van de reflectie-API in Java is dat het ook privéleden van de klas kan manipuleren.

Het pakket java.lang.reflect biedt vele klassen om reflectie java te implementeren. Methoden van de klasse java.lang.Class worden gebruikt om de volledige metadata van een bepaalde klasse te verzamelen.

In deze tutorial leer je-

  • Wat is reflectie
  • Klasse in pakket java.lang.reflect
  • Methoden die worden gebruikt in java.lang.Class
  • Hoe u volledige informatie over een klas kunt krijgen
  • Voorbeeld 1: Metadata van Class ophalen
  • Voorbeeld 2: Metadata van variabele ophalen
  • Voorbeeld 3: Hoe metadata van methode te verkrijgen
  • Voorbeeld 4: Metadata van constructeurs ophalen

Klasse in pakket java.lang.reflect

Hieronder volgt een lijst met verschillende Java-klassen in java.lang.package om reflectie-

  • Veld : Deze klasse wordt gebruikt om declaratieve informatie te verzamelen, zoals datatype, toegangsmodificator, naam en waarde van een variabele.
  • Methode : deze klasse wordt gebruikt om declaratieve informatie te verzamelen, zoals toegangsmodificator, retourneringstype, naam, parametertypen en uitzonderingstype van een methode.
  • Constructor : deze klasse wordt gebruikt om declaratieve informatie te verzamelen, zoals toegangsmodificator, naam en parametertypes van een constructor.
  • Modifier : deze klasse wordt gebruikt om informatie te verzamelen over een bepaalde toegangsmodificator.

Methoden die worden gebruikt in java.lang.Class

  • Public String getName () : Retourneert de naam van de klasse.
  • public Class getSuperclass () : Retourneert de verwijzing naar de superklasse
  • Public Class [] getInterfaces () : Retourneert een array van interfaces geïmplementeerd door de opgegeven klasse
  • Public in getModifiers (): Retourneert een geheel getal dat de modifiers van de opgegeven klasse vertegenwoordigt die als parameter moet worden doorgegeven aan de " public static String toString (int i)" -methode die de toegangsspecificatie voor de opgegeven klasse retourneert.

Hoe u volledige informatie over een klas kunt krijgen

Om informatie te krijgen over variabelen, methoden en constructors van een klasse, moeten we een object van de klasse maken.
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;}}
  • Het volgende voorbeeld toont verschillende manieren om een ​​object van klasse "class" te maken:
  • Voorbeeld 1: Metadata van Class ophalen

    Het volgende voorbeeld laat zien hoe u metagegevens kunt ophalen, zoals: klassenaam, superklassenaam, geïmplementeerde interfaces en toegangsmodificatoren van een klasse.

    We krijgen de metadata van de onderstaande klasse met de naam Guru99Base.class:

    import java.io.Serializable;public abstract class Guru99Base implements Serializable,Cloneable {}
    1. De naam van de klas is: Guru99Base
    2. De toegangsmodificatoren zijn: openbaar en abstract
    3. Het heeft interfaces geïmplementeerd: Serializable en Cloneable
    4. Omdat het geen enkele klasse expliciet heeft uitgebreid, is de superklasse: java.lang.Object
    Onderstaande klas krijgt de metagegevens van Guru99Base.class en drukt deze af:
    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. druk de naam van de klasse af met de methode getName
    2. Druk de naam van de superklasse af met de methode getSuperClass (). GetName ()
    3. Druk de naam van de geïmplementeerde interfaces af
    4. Druk de toegangsmodificatoren af ​​die door de klas worden gebruikt

    Voorbeeld 2: Metadata van variabele ophalen

    De volgende voorbeelden laten zien hoe u metagegevens van een variabele kunt ophalen:

    Hier maken we een klasse met de naam Guru99VariableMetaData .class met enkele variabelen:

    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";}
    Stappen om de metadata over de variabelen in de bovenstaande klasse te krijgen:
    1. Maak het class-object van de bovenstaande klasse, dwz Guru99VariableMetaData.class, zoals hieronder:
      Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData();Class guru99ClassObjVar = guru99ClassVar.getClass();
    2. Haal de metadata op in de vorm van een veldarray met behulp van de methoden getFields () of getDeclaredFields () , zoals hieronder:
      Field[] guru99Field1= guru99ClassObjVar .getFields();Field[] guru99Fiel2= guru99ClassObjVar .getDeclaredFields();

    methode getFields () retourneert metagegevens van de openbare variabele van zowel de opgegeven klasse als de superklasse.

    getDeclaredFields () - methode retourneert metagegevens van alle variabelen van alleen de opgegeven klasse.

    1. Haal de naam van de variabelen op met de methode "public String getName ()".
    2. Haal het datatype van de variabelen op met de methode "public Class getType ()".
    3. Haal de waarde van de variabele op met de methode "public xxx get (Field)".

      Hier kan xxx een byte zijn of een afkorting van elk type waarde dat we willen ophalen.

    4. Verkrijg de toegangsmodificatoren van de variabelen met behulp van de methoden getModifier () en Modifier.toString (int i).

      Hier zijn we een klasse aan het schrijven om de metadata te krijgen van de variabelen die aanwezig zijn in de klasse 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. Klasseobject gemaakt voor Guru99VariableMetaData.class
      2. Heb alle metadata van de variabelen in een Field-array
      3. Alle variabelenamen in de klasse Guru99VariableMetaData.class afgedrukt
      4. Alle gegevenstypen van de variabelen in de klasse Guru99VariableMetaData.class afgedrukt
      5. Alle toegangsmodificatoren van de variabelen in de klasse Guru99VariableMetaData.class afgedrukt
      6. Afgedrukte waarden van alle variabelen in Afgedrukt alle gegevenstypen van de variabelen in de klasse Guru99VariableMetaData.class

      Voorbeeld 3: Metadata van methode verkrijgen

      De volgende voorbeelden laten zien hoe u metagegevens van een methode kunt ophalen:

      Hier maken we met enkele methoden een klasse met de naam 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");}} 

      Stappen om de metadata over de methoden in de bovenstaande klasse te krijgen:

      1. Maak het class-object van de bovenstaande klasse, dwz Guru99MethodMetaData.class, zoals hieronder:
        Guru99MethodMetaData guru99ClassVar = new Guru99MethodMetaData ();Class guru99ClassObjVar = guru99ClassVar.getClass();
      2. Haal methode-informatie op in een Method-array met behulp van de methode getMethods () en getDeclaredMethods (), zoals hieronder:
        Method[] guru99 Method 1= guru99ClassObjVar .get Methods();Method [] guru99 Method 2= guru99ClassObjVar .getDeclared Method s();

        methode getMethods () retourneert metagegevens van de openbare methoden van zowel de opgegeven klasse als de superklasse.

        methode getDeclaredMethods () retourneert alleen metagegevens van alle methoden uit de opgegeven klasse.

      3. Haal de naam van de methode op met de methode getName () .
      4. Haal het retourtype van de methode op met de methode getReturnType () .
      5. Krijg toegangsmodificatoren van de methoden met behulp van de methoden getModifiers () en Modifiers.toString (int i) .
      6. Haal methodeparametertypes op met de methode getParameterTypes () die een klasse-array retourneert.
      7. Krijg een gegenereerde uitzondering met behulp van de methode getExceptionTypes () die een klasse-array retourneert.

      Hier schrijven we een klasse om de metadata op te halen van de methoden die aanwezig zijn in de klasse 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. Klasseobject gemaakt voor Guru99MethodMetaData.class
      2. Heb alle metadata van alle methoden in een Method-array
      3. Alle namen van methoden afgedrukt die aanwezig zijn in de klasse Guru99MethodMetaData.class
      4. Afgedrukte retourtypen van de methoden in de klasse Guru99MethodMetaData.class
      5. Alle toegangsmodificatoren van de methoden in de klasse Guru99MethodMetaData.class afgedrukt
      6. Afgedrukte parametertypes van de methoden in Guru99MethodMetaData.class
      7. Afgedrukte uitzonderingen worden gegenereerd door methoden in Guru99MethodMetaData.class

      Voorbeeld 4: Metadata van constructeurs ophalen

      De volgende voorbeelden laten zien hoe u metagegevens van constructeurs kunt ophalen:

      Hier maken we een klasse met de naam Guru99Constructor.class met verschillende constructors:

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

      Hier zijn we een klasse aan het schrijven om de metadata van de constructors op te halen die aanwezig zijn in de klasse 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. Klasseobject gemaakt voor Guru99Constructor.class
      2. Heb alle metadata van alle constructors in een Constructor-array
      3. Alle namen van de constructeur afgedrukt die aanwezig zijn in de klasse Guru99Constructor.class
      4. Alle toegangsmodificatoren van de constructors in de klasse Guru99Constructor.class afgedrukt
      5. Afgedrukte parametertypes van de constructors in Guru99Constructor.class
      6. Afgedrukte uitzonderingen worden gegenereerd door constructeurs in Guru99Constructor.class

      Overzicht:

      • Reflectieprogrammering in Java helpt bij het ophalen en wijzigen van informatie over Klassen en Klasse-leden zoals variabelen, methoden en constructeurs.
      • Reflection API in Java kan worden geïmplementeerd met behulp van klassen in het pakket java.lang.reflect en methoden van de klasse java.lang.Class.
      • Enkele veelgebruikte methoden van de klasse java.lang.Class zijn getName (), getSuperclass (), getInterfaces (), getModifiers () enz.
      • Enkele veelgebruikte klassen in het pakket java.lang.reflect zijn Veld, Methode, Constructor, Modifier, enz.
      • Reflection API heeft toegang tot privémethoden en variabelen van een klasse die een beveiligingsrisico kunnen vormen.
      • Reflection API is een krachtige mogelijkheid die door Java wordt geboden, maar het gaat gepaard met een aantal overheadkosten, zoals tragere prestaties, beveiligingsproblemen en toestemmingsproblemen. Daarom moet de reflectie-API worden behandeld als het laatste redmiddel voor het uitvoeren van een bewerking.