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;}}
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 {}
- Název třídy je: Guru99Base
- Jeho modifikátory přístupu jsou: veřejné a abstraktní
- Má implementovaná rozhraní: Serializovatelná a Cloneable
- Protože výslovně nerozšíří žádnou třídu, je to super třída: java.lang.Object
import java.lang.reflect.Modifier;public class Guru99GetclassMetaData {public static void main (String [] args) throws ClassNotFoundException {// Create Class object for Guru99Base.classClassguru99ClassObj = 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));}}
- vytiskněte název třídy pomocí metody getName
- Vytiskněte název super třídy pomocí metody getSuperClass (). GetName ()
- Vytiskněte název implementovaných rozhraní
- 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ě:
- 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();
- 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.
- Získejte název proměnných pomocí metody "public String getName ()".
- Získejte datový typ proměnných pomocí metody "public Class getType ()".
- 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.
- 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("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *") ;}}}
- Vytvořil objekt třídy pro Guru99VariableMetaData.class
- Mám všechna metadata proměnných v poli Field
- Vytištěny všechny názvy proměnných ve třídě Guru99VariableMetaData.class
- Vytištěny všechny datové typy proměnných ve třídě Guru99VariableMetaData.class
- Vytištěny všechny modifikátory přístupu proměnných ve třídě Guru99VariableMetaData.class
- 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
- 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();
- 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.
- Získejte název metody pomocí metody getName () .
- Získejte návratový typ metody pomocí metody getReturnType () .
- Získejte modifikátory přístupu metod pomocí metod getModifiers () a Modifiers.toString (int i) .
- Získejte typy parametrů metody pomocí metody getParameterTypes (), která vrací pole třídy.
- Získejte vyvolanou výjimku pomocí metody getExceptionTypes (), která vrací pole třídy.
- Vytvořen objekt třídy pro Guru99MethodMetaData.class
- Mám všechna metadata všech metod v poli Method
- Vytištěny všechny názvy metod přítomné ve třídě Guru99MethodMetaData.class
- Vytištěné návratové typy metod ve třídě Guru99MethodMetaData.class
- Vytištěny všechny modifikátory přístupu metod ve třídě Guru99MethodMetaData.class
- Vytištěné typy parametrů metod v Guru99MethodMetaData.class
- Vytištěné výjimky jsou vyvolány metodami v Guru99MethodMetaData.class
- Vytvořen objekt třídy pro Guru99Constructor.class
- Mám všechna metadata všech konstruktorů v poli konstruktoru
- Vytištěny všechny názvy konstruktoru přítomné ve třídě Guru99Constructor.class
- Vytištěny všechny modifikátory přístupu konstruktorů ve třídě Guru99Constructor.class
- Vytištěné typy parametrů konstruktorů v Guru99Constructor.class
- Vytištěné výjimky jsou vyvolány konstruktory v Guru99Constructor.class
- 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.
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ě:
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("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ");}}}
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("*******************************************");}}}
Souhrn: