Výukový program Java Reflection API s příkladem

Obsah:

Anonim

Co je to odraz v Javě?

Java Reflection je proces analýzy a úpravy všech schopností třídy za běhu. Reflection API v Javě se používá k manipulaci s třídou a jejími členy, které zahrnují pole, metody, konstruktor atd. Za běhu.

Jednou z výhod reflexního API v Javě je, že může manipulovat také se soukromými členy třídy.

Balíček java.lang.reflect poskytuje mnoho tříd k implementaci reflexe java.Methods třídy java.lang.Class se používá ke shromažďování úplných metadat konkrétní třídy.

V tomto výukovém programu se naučíte

  • Co je to odraz
  • Třída v balíčku java.lang.reflect
  • Metody používané v java.lang.Class
  • Jak získat úplné informace o třídě
  • Příklad 1: Jak získat metadata třídy
  • Příklad 2: Jak získat metadata proměnné
  • Příklad 3: Jak získat metadata metody
  • Příklad 4: Jak získat metadata konstruktorů

Třída v balíčku java.lang.reflect

Následuje seznam různých tříd Java v java.lang.package k implementaci reflexe-

  • Pole : Tato třída se používá ke shromažďování deklarativních informací, jako je datový typ, modifikátor přístupu, název a hodnota proměnné.
  • Metoda : Tato třída se používá ke shromažďování deklarativních informací, jako je modifikátor přístupu, návratový typ, název, typy parametrů a typ výjimky metody.
  • Konstruktor : Tato třída se používá ke shromažďování deklarativních informací, jako jsou modifikátory přístupu, typy názvů a parametrů konstruktoru.
  • Modifikátor : Tato třída se používá ke shromažďování informací o konkrétním modifikátoru přístupu.

Metody používané v java.lang.Class

  • Public String getName () : Vrátí název třídy.
  • public Class getSuperclass () : Vrátí odkaz na super třídu
  • Public Class [] getInterfaces () : Vrací pole rozhraní implementovaných zadanou třídou
  • Public in getModifiers (): Vrátí celočíselnou hodnotu představující modifikátory zadané třídy, kterou je třeba předat jako parametr metodě „ public static String toString (int i)“, která vrací specifikátor přístupu pro danou třídu.

Jak získat úplné informace o třídě

Chcete-li získat informace o proměnných, metodách a konstruktorech třídy, musíme vytvořit objekt třídy.
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;}}
  • Následující příklad ukazuje různé způsoby, jak vytvořit objekt třídy "class":
  • Příklad 1: Jak získat metadata třídy

    Následující příklad ukazuje, jak získat metadata, například: Název třídy, název super třídy, implementovaná rozhraní a modifikátory přístupu třídy.

    Dostaneme metadata pod třídou s názvem Guru99Base.class:

    import java.io.Serializable;public abstract class Guru99Base implements Serializable,Cloneable {}
    1. Název třídy je: Guru99Base
    2. Jeho modifikátory přístupu jsou: veřejné a abstraktní
    3. Má implementovaná rozhraní: Serializovatelná a Cloneable
    4. Protože výslovně nerozšíří žádnou třídu, je to super třída: java.lang.Object
    Níže třída získá metadata Guru99Base.class a vytiskne je:
    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. vytiskněte název třídy pomocí metody getName
    2. Vytiskněte název super třídy pomocí metody getSuperClass (). GetName ()
    3. Vytiskněte název implementovaných rozhraní
    4. Vytiskněte modifikátory přístupu používané třídou

    Příklad 2: Jak získat metadata proměnné

    Následující příklady ukazují, jak získat metadata proměnné:

    Tady vytváříme třídu s názvem Guru99VariableMetaData .class s některými proměnnými:

    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";}
    Kroky k získání metadat o proměnných ve výše uvedené třídě:
    1. Vytvořte objekt třídy výše uvedené třídy, tj. Guru99VariableMetaData.class, jak je uvedeno níže:
      Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData();Class guru99ClassObjVar = guru99ClassVar.getClass();
    2. Získejte metadata ve formě pole pole pomocí metod getFields () nebo getDeclaredFields (), jak je uvedeno níže:
      Field[] guru99Field1= guru99ClassObjVar .getFields();Field[] guru99Fiel2= guru99ClassObjVar .getDeclaredFields();

    Metoda getFields () vrací metadata veřejné proměnné ze zadané třídy i z její super třídy.

    Metoda getDeclaredFields () vrací metadata všech proměnných pouze ze zadané třídy.

    1. Získejte název proměnných pomocí metody "public String getName ()".
    2. Získejte datový typ proměnných pomocí metody "public Class getType ()".
    3. Zjistěte hodnotu proměnné pomocí metody „public xxx get (Field)“.

      Zde xxx může být bajt nebo menší jakýkoli typ hodnoty, kterou chceme načíst.

    4. Získejte modifikátory přístupu proměnných pomocí metod getModifier () a Modifier.toString (int i).

      Tady píšeme třídu, abychom získali metadata proměnných přítomných ve třídě 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. Vytvořil objekt třídy pro Guru99VariableMetaData.class
      2. Mám všechna metadata proměnných v poli Field
      3. Vytištěny všechny názvy proměnných ve třídě Guru99VariableMetaData.class
      4. Vytištěny všechny datové typy proměnných ve třídě Guru99VariableMetaData.class
      5. Vytištěny všechny modifikátory přístupu proměnných ve třídě Guru99VariableMetaData.class
      6. Vytištěné hodnoty všech proměnných v Vytištěny všechny datové typy proměnných ve třídě Guru99VariableMetaData.class

      Příklad 3: Jak získat metadata metody

      Následující příklady ukazují, jak získat metadata metody:

      Tady s některými metodami vytváříme třídu s názvem 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");}} 

      Kroky k získání metadat o metodách ve výše uvedené třídě:

      1. Vytvořte objekt třídy výše uvedené třídy, tj. Guru99MethodMetaData.class, jak je uvedeno níže:
        Guru99MethodMetaData guru99ClassVar = new Guru99MethodMetaData ();Class guru99ClassObjVar = guru99ClassVar.getClass();
      2. Získejte informace o metodě v poli Method pomocí metody getMethods () a getDeclaredMethods (), jak je uvedeno níže:
        Method[] guru99 Method 1= guru99ClassObjVar .get Methods();Method [] guru99 Method 2= guru99ClassObjVar .getDeclared Method s();

        Metoda getMethods () vrací metadata veřejných metod ze zadané třídy i její super třídy.

        Metoda getDeclaredMethods () vrací metadata všech metod pouze ze zadané třídy.

      3. Získejte název metody pomocí metody getName () .
      4. Získejte návratový typ metody pomocí metody getReturnType () .
      5. Získejte modifikátory přístupu metod pomocí metod getModifiers () a Modifiers.toString (int i) .
      6. Získejte typy parametrů metody pomocí metody getParameterTypes (), která vrací pole třídy.
      7. Získejte vyvolanou výjimku pomocí metody getExceptionTypes (), která vrací pole třídy.

      Tady píšeme třídu, abychom získali metadata metod přítomných ve třídě 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. Vytvořen objekt třídy pro Guru99MethodMetaData.class
      2. Mám všechna metadata všech metod v poli Method
      3. Vytištěny všechny názvy metod přítomné ve třídě Guru99MethodMetaData.class
      4. Vytištěné návratové typy metod ve třídě Guru99MethodMetaData.class
      5. Vytištěny všechny modifikátory přístupu metod ve třídě Guru99MethodMetaData.class
      6. Vytištěné typy parametrů metod v Guru99MethodMetaData.class
      7. Vytištěné výjimky jsou vyvolány metodami v Guru99MethodMetaData.class

      Příklad 4: Jak získat metadata konstruktorů

      Následující příklady ukazují, jak získat metadata konstruktorů:

      Tady vytváříme třídu s názvem Guru99Constructor.class s různými konstruktory:

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

      Tady píšeme třídu, abychom získali metadata konstruktorů přítomných ve třídě 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. Vytvořen objekt třídy pro Guru99Constructor.class
      2. Mám všechna metadata všech konstruktorů v poli konstruktoru
      3. Vytištěny všechny názvy konstruktoru přítomné ve třídě Guru99Constructor.class
      4. Vytištěny všechny modifikátory přístupu konstruktorů ve třídě Guru99Constructor.class
      5. Vytištěné typy parametrů konstruktorů v Guru99Constructor.class
      6. Vytištěné výjimky jsou vyvolány konstruktory v Guru99Constructor.class

      Souhrn:

      • Reflexní programování v Javě pomáhá při načítání a úpravách informací o Classes a Class Class, jako jsou proměnné, metody, konstruktory.
      • Reflexní API v Javě lze implementovat pomocí tříd v balíčku java.lang.reflect a metod třídy java.lang.Class.
      • Některé běžně používané metody třídy java.lang.Class jsou getName (), getSuperclass (), getInterfaces (), getModifiers () atd.
      • Některé běžně používané třídy v balíčku java.lang.reflect jsou Field, Method, Constructor, Modifier atd.
      • Reflection API může přistupovat k soukromým metodám a proměnným třídy, které by mohly být bezpečnostní hrozbou.
      • Reflection API je výkonná funkce poskytovaná Javou, ale přichází s některými režijními náklady, jako je pomalejší výkon, chyba zabezpečení a problém s oprávněním. Reflexní API by proto mělo být považováno za poslední možnost k provedení operace.