Java Учебное пособие по Reflection API с примером
Что такое рефлексия в Java?
Java Рефлексия — это процесс анализа и изменения всех возможностей класса во время выполнения. API отражения в Java используется для управления классом и его членами, включая поля, методы, конструктор и т. д. во время выполнения.
Одно из преимуществ API отражения в Java то есть он также может манипулировать частными членами класса.
Пакет java.lang.reflect предоставляет множество классов для реализации отражения. Java. Методы класса java.lang.Class используются для сбора полных метаданных определенного класса.
Класс в пакете java.lang.reflect
Ниже приведен список различный Java классов в java.lang.package для реализации отражения-
- Поиск: этот класс используется для сбора декларативной информации, такой как тип данных, модификатор доступа, имя и значение переменной.
- Способ доставки: этот класс используется для сбора декларативной информации, такой как модификатор доступа, тип возвращаемого значения, имя, типы параметров и тип исключения метода.
- Конструктор: этот класс используется для сбора декларативной информации, такой как модификатор доступа, имя и типы параметров конструктора.
- Модификатор: этот класс используется для сбора информации о конкретном модификаторе доступа.
Методы, используемые в java.lang.Class
- Открытая строка getName (): Возвращает имя класса.
- публичный класс getSuperclass(): Возвращает ссылку на суперкласс.
- Публичный класс[] getInterfaces() : Возвращает массив интерфейсов, реализованных указанным классом.
-
Публичный в getModifiers(): Возвращает целочисленное значение, представляющее модификаторы указанного класса, которое необходимо передать в качестве параметра функции «общедоступная статическая строка toString (int i)» метод, который возвращает спецификатор доступа для данного класса.
Как получить полную информацию о классе
public class Guru99ClassObjectCreation {
public static void main (String[] args) throws ClassNotFoundException {
//1 - By using Class.forname() method
Class c1 = Class.forName("Guru99ClassObjectCreation");
//2- By using getClass() method
Guru99ClassObjectCreation guru99Obj = new Guru99ClassObjectCreation();
Class c2 = guru99Obj.getClass();
//3- By using .class
Class c3= Guru99ClassObjectCreation.class;
}
}
Пример 1: Как получить метаданные класса
В следующем примере показано, как получить такие метаданные, как имя класса, имя суперкласса, реализованные интерфейсы и модификаторы доступа класса.
Мы получим метаданные приведенного ниже класса с именем Guru99Base.class:
import java.io.Serializable;
public abstract class Guru99Base implements Serializable,Cloneable {
}
- Имя класса: Guru99Base.
- Модификаторы доступа: общедоступные и абстрактные.
- Он реализовал интерфейсы: сериализуемый и клонируемый.
- Поскольку он явно не расширял какой-либо класс, его суперкласс: java.lang.Object
Ниже класс получит метаданные Guru99Base.class и распечатает их:
import java.lang.reflect.Modifier;
public class Guru99GetclassMetaData {
public static void main (String [] args) throws ClassNotFoundException {
// Create Class object for Guru99Base.class
Class guru99ClassObj = Guru99Base.class;
// Print name of the class
system.out.println("Name of the class is : " +guru99ClassObj.getName());
// Print Super class name
system.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() method
class[] guru99InterfaceList = guru99classObj.getInterfaces();
// Print the implemented interfaces using foreach loop
system.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 class
int guru99AccessModifier= guru99classObj.getModifiers();
// Print the access modifiers
System.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 () or 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.class Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData(); Class guru99ClassObjVar = guru99ClassVar.getClass(); // Get the metadata of all the fields of the class Guru99VariableMetaData Field[] guru99Field1= guru99ClassObjVar.getDeclaredFields(); // Print name, datatypes, access modifiers and values of the varibales of the specified class for(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.
- Получил все метаданные переменных в массиве полей.
- Напечатаны все имена переменных в классе 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();
получитьметоды() Метод возвращает метаданные общедоступных методов из указанного класса, а также из его суперкласса.
getDeclaredMethods () метод возвращает метаданные всех методов только из указанного класса.
- Получите имя метода, используя GetName () метод.
- Получите тип возвращаемого значения метода, используя получить тип возврата () метод.
- Получите модификаторы доступа к методам, используя 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 может получать доступ к частным методам и переменным класса, что может представлять угрозу безопасности.
- 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.class
class 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 names
System.out.println("Name of the method : "+method.getName());
// Print return type of the methods
System.out.println("Return type of the method : "+method.getReturnType());
//Get the access modifier list and print
int guru99ModifierList = method.getModifiers();
System.Out.printlin ("Method access modifiers : "+Modifier.toString(guru99ModifierList));
// Get and print parameters of the methods
Class[] 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 method
Class[] 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.class
Class guru99Class=Guru99Constructor.class;
// Get all the constructor information in the Constructor array
Constructor[] guru99ConstructorList = guru99Class.getConstructors();
for (Constructor constructor : guru99ConstructorList) {
// Print all name of each constructor
System.out.println("Constrcutor name : "+constructor.getName());
//Get and print access modifiers of each constructor
int guru99Modifiers= constructor.getModifiers();
System.Out.printlin ("Constrctor modifier : "+Modifier.toString(guru99Modifiers));
// Get and print parameter types
Class[] 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 constructors
Class[] 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("*******************************************");
}
}
}
















