Какво е отражение в Java?
Java Reflection е процес на анализиране и модифициране на всички възможности на клас по време на изпълнение. API за отразяване в Java се използва за манипулиране на клас и неговите членове, които включват полета, методи, конструктор и т.н. по време на изпълнение.
Едно от предимствата на API за размисъл в Java е, че той може да манипулира и частни членове на класа.
Пакетът java.lang.reflect предоставя много класове за реализиране на отражение java.Methods на класа java.lang.Class се използва за събиране на пълните метаданни на определен клас.
В този урок ще научите -
- Какво е Отражение
- Клас в java.lang.reflect пакет
- Методи, използвани в java.lang.Class
- Как да получите пълна информация за клас
- Пример 1: Как да получите метаданни на класа
- Пример 2: Как да получите метаданни на променлива
- Пример 3: Как да получите метаданни на метода
- Пример 4: Как да получите метаданни на конструктори
Клас в java.lang.reflect пакет
Следва списък на различни Java класове в java.lang.package за внедряване на отражение-
- Поле : Този клас се използва за събиране на декларативна информация като тип данни, модификатор на достъп, име и стойност на променлива.
- Метод : Този клас се използва за събиране на декларативна информация като модификатор на достъпа, тип на връщане, име, типове параметри и тип изключения на метод.
- Конструктор : Този клас се използва за събиране на декларативна информация като модификатор на достъпа, име и параметри на конструктор.
- Модификатор : Този клас се използва за събиране на информация за определен модификатор на достъп.
Методи, използвани в java.lang.Class
- Public String getName () : Връща името на класа.
- public Class getSuperclass () : Връща препратката към супер класа
- Публичен клас [] getInterfaces () : Връща масив от интерфейси, изпълнени от посочения клас
- Публично в getModifiers (): Връща целочислена стойност, представляваща модификаторите на посочения клас, която трябва да бъде предадена като параметър на метода " public static String toString (int i)" , който връща спецификатора за достъп за дадения клас.
Как да получите пълна информация за клас
За да получим информация за променливи, методи и конструктори на клас, трябва да създадем обект от класа.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;}}
Пример 1: Как да получите метаданни на класа
Следващият пример показва как да получите метаданни като: Име на клас, име на супер клас, внедрени интерфейси и модификатори на достъп на клас.
Ще получим метаданните от клас под име Guru99Base.class:
import java.io.Serializable;public abstract class Guru99Base implements Serializable,Cloneable {}
- Името на класа е: Guru99Base
- Модификаторите за достъп са: публични и абстрактни
- Той е реализирал интерфейси: сериализуем и клонируем
- Тъй като не е разширил нито един клас изрично, той е супер клас: 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));}}
- отпечатайте името на класа, използвайки метода getName
- Отпечатайте името на супер класа, като използвате метода getSuperClass (). GetName ()
- Отпечатайте името на внедрените интерфейси
- Отпечатайте модификаторите за достъп, използвани от класа
Пример 2: Как да получите метаданни на променлива
Следващите примери показват как да получите метаданни на променлива:
Тук създаваме клас с име Guru99VariableMetaData .class с някои променливи:
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";}Стъпки за получаване на метаданните за променливите в горния клас:
- Създайте обекта на класа от горния клас, т.е. Guru99VariableMetaData.class, както е показано по-долу:
Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData();Class guru99ClassObjVar = guru99ClassVar.getClass();
- Вземете метаданните под формата на масив на поле, използвайки методите getFields () или getDeclaredFields () , както е показано по-долу:
Field[] guru99Field1= guru99ClassObjVar .getFields();Field[] guru99Fiel2= guru99ClassObjVar .getDeclaredFields();
методът getFields () връща метаданни на публичната променлива от посочения клас, както и от нейния супер клас.
методът getDeclaredFields () връща метаданни на всички променливи само от посочения клас.
- Вземете името на променливите, използвайки метода "public String getName ()".
- Вземете типа данни на променливите, използвайки метода "public Class getType ()".
- Вземете стойността на променливата, използвайки метода "public xxx get (Field)".
Тук xxx може да е байт или да е кратък от всякакъв вид стойност, която искаме да извлечем.
- Вземете модификаторите за достъп на променливите с помощта на методите getModifier () и Modifier.toString (int i).
Тук пишем клас, за да получим метаданните на променливите, присъстващи в класа 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("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *") ;}}}
- Създаден обект на клас за Guru99VariableMetaData.class
- Получих всички метаданни на променливите в масив Field
- Отпечатани всички имена на променливи в класа Guru99VariableMetaData.class
- Отпечатани всички типове данни на променливите в класа Guru99VariableMetaData.class
- Отпечатани всички модификатори на достъп на променливите в класа Guru99VariableMetaData.class
- Отпечатани стойности на всички променливи в Отпечатани всички типове данни на променливите в класа Guru99VariableMetaData.class
- Създайте обекта на класа от горния клас, т.е. Guru99MethodMetaData.class, както е показано по-долу:
Guru99MethodMetaData guru99ClassVar = new Guru99MethodMetaData ();Class guru99ClassObjVar = guru99ClassVar.getClass();
- Вземете информация за метода в масив от методи, като използвате методите getMethods () и getDeclaredMethods (), както е показано по-долу:
Method[] guru99 Method 1= guru99ClassObjVar .get Methods();Method [] guru99 Method 2= guru99ClassObjVar .getDeclared Method s();
методът getMethods () връща метаданни на публичните методи от посочения клас, както и от неговия супер клас.
методът getDeclaredMethods () връща метаданни на всички методи само от посочения клас.
- Вземете името на метода, използвайки метода getName () .
- Вземете типа на връщане на метода, използвайки метода getReturnType () .
- Вземете модификатори на достъп до методите, използвайки методите getModifiers () и Modifiers.toString (int i) .
- Вземете типове параметри на метода, като използвате метода getParameterTypes () , който връща масив от клас.
- Получете изхвърлено изключение с помощта на метода getExceptionTypes () , който връща масив от клас.
- Създаден обект на клас за Guru99MethodMetaData.class
- Получих всички метаданни на всички методи в масив от методи
- Отпечатани всички имена на методи, присъстващи в класа Guru99MethodMetaData.class
- Отпечатани типове връщане на методите в класа Guru99MethodMetaData.class
- Отпечатани всички модификатори за достъп на методите в класа Guru99MethodMetaData.class
- Типове отпечатани параметри на методите в Guru99MethodMetaData.class
- Отпечатаните изключения се изхвърлят от методи в Guru99MethodMetaData.class
- Създаден обект на клас за Guru99Constructor.class
- Има всички метаданни на всички конструктори в масив на конструктор
- Отпечатани всички имена на конструктора, присъстващи в класа Guru99Constructor.class
- Отпечатани всички модификатори за достъп на конструкторите в класа Guru99Constructor.class
- Типове отпечатани параметри на конструкторите в Guru99Constructor.class
- Отпечатаните изключения се изхвърлят от конструктори в Guru99Constructor.class
- Програмирането на отражение в java помага при извличането и модифицирането на информация за класове и членове на класа като променлива, методи, конструктори.
- API за отразяване в Java може да бъде реализиран с помощта на класове в пакета java.lang.reflect и методи на класа java.lang.Class.
- Някои често използвани методи на класа java.lang.Class са getName (), getSuperclass (), getInterfaces (), getModifiers () и др.
- Някои често използвани класове в пакета java.lang.reflect са Field, Method, Constructor, Modifier и др.
- API за отразяване може да осъществява достъп до частни методи и променливи от клас, които могат да представляват заплаха за сигурността.
- Reflection API е мощна възможност, предоставена от Java, но идва с някои режийни разходи като по-бавна производителност, уязвимост на сигурността и проблем с разрешенията. Следователно API за отражение трябва да се третира като последна мярка за извършване на операция.
Пример 3: Как да получите метаданни на метода
Следващите примери показват как да получите метаданни на метод:
Тук създаваме клас с име 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");}}
Стъпки за получаване на метаданните за методите в горния клас:
Тук пишем клас, за да получим метаданните на методите, присъстващи в класа 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("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ");}}}
Пример 4: Как да получите метаданни на конструктори
Следващите примери показват как да получите метаданни на конструктори:
Тук създаваме клас с име Guru99Constructor.class с различни конструктори:
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{ }}
Тук пишем клас, за да получим метаданните на конструкторите, присъстващи в класа 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("*******************************************");}}}
Резюме: