Рефлексия в Java: инспекция классов, методов и полей во время выполнения
Мастерство рефлексии в Java
Узнайте, как API рефлексии Java позволяет инспектировать и модифицировать классы, методы, поля и конструкторы во время выполнения, повышая гибкость и обеспечивая мощные динамические поведения.
В Java рефлексия позволяет изучать и манипулировать классами, интерфейсами, конструкторами, методами и полями пока программа выполняется.
Java предоставляет класс Class, инкапсулирующий метаданные о классе или интерфейсе. Экземпляр Class — это шлюз к возможностям рефлексии.
Получение объекта Class
Для выполнения рефлексии сначала нужен объект Class. Есть три распространенных способа получить его:
- Использование
Class.forName()Class<Dog> clazz = Class.forName("com.example.Dog");Метод принимает полное имя класса и загружает его, если он еще не загружен.
- Использование
getClass()на экземпляреDog dog = new Dog(); Class<Dog> clazz = dog.getClass();Получает класс объекта во время выполнения.
- Использование литерала
.classClass<Dog> clazz = Dog.class;Предоставляет ссылку на объект
Classво время компиляции.
Получив экземпляр Class, вы можете запрашивать его методы, поля, конструкторы и аннотации.
Практический пример: Инспекция класса Dog
import java.lang.Class; import java.lang.reflect.*; class Animal {} public class Dog extends Animal { public void display() { System.out.println("I am a dog."); } } public class Main { public static void main(String[] args) { try { Dog dog = new Dog(); Class<Dog> clazz = dog.getClass(); System.out.println("Name: " + clazz.getName()); System.out.println("Modifier: " + Modifier.toString(clazz.getModifiers())); System.out.println("Superclass: " + clazz.getSuperclass().getName()); } catch (Exception e) { e.printStackTrace(); } } }
Вывод:
Name: com.example.Dog Modifier: public Superclass: com.example.Animal
В этом фрагменте мы создали экземпляр Dog, получили его объект Class и запросили имя класса, модификатор доступа и суперкласс.
Для глубокого понимания Class обратитесь к официальной документации Java Class.
Изучение полей, методов и конструкторов
Пакет java.lang.reflect предоставляет специальные классы для интроспекции конкретных членов:
Method— детали о методах.Field— детали о полях.Constructor— детали о конструкторах.
Рефлексия методов
Класс Method раскрывает метаданные, такие как имя, тип возвращаемого значения и модификаторы. Ниже приведен краткий пример:
import java.lang.reflect.*; class Dog { public void display() { System.out.println("I am a dog."); } private void makeSound() { System.out.println("Bark Bark"); } } public class Main { public static void main(String[] args) { try { Dog dog = new Dog(); Method[] methods = dog.getClass().getDeclaredMethods(); for (Method m : methods) { System.out.println("Method Name: " + m.getName()); System.out.println("Modifier: " + Modifier.toString(m.getModifiers())); System.out.println("Return Type: " + m.getReturnType()); System.out.println(); } } catch (Exception e) { e.printStackTrace(); } } }
Вывод:
Method Name: display Modifier: public Return Type: void Method Name: makeSound Modifier: private Return Type: void
Для полного списка утилит Method посетите официальную документацию Method.
Рефлексия полей
Поля могут быть доступны и модифицированы во время выполнения. Класс Field предоставляет get, set и утилиты модификаторов. Пример:
import java.lang.reflect.*; class Dog { public String type; private String color; } public class Main { public static void main(String[] args) { try { Dog dog = new Dog(); Class<Dog> clazz = dog.getClass(); // Публичное поле Field typeField = clazz.getField("type"); typeField.set(dog, "labrador"); System.out.println("Value: " + typeField.get(dog)); System.out.println("Modifier: " + Modifier.toString(typeField.getModifiers())); // Приватное поле Field colorField = clazz.getDeclaredField("color"); colorField.setAccessible(true); colorField.set(dog, "brown"); System.out.println("Value: " + colorField.get(dog)); System.out.println("Modifier: " + Modifier.toString(colorField.getModifiers())); } catch (Exception e) { e.printStackTrace(); } } }
Вывод:
Value: labrador Modifier: public Value: brown Modifier: private
Изучите документацию класса Field для продвинутого использования.
Рефлексия конструкторов
Конструкторы интроспектируются через класс Constructor. Следующий код перечисляет все конструкторы Dog:
import java.lang.reflect.*; class Dog { public Dog() {} private Dog(int age) {} } public class Main { public static void main(String[] args) { try { Constructor<Dog>[] cons = Dog.class.getDeclaredConstructors(); for (Constructor<Dog> c : cons) { System.out.println("Constructor Name: " + c.getName()); System.out.println("Modifier: " + Modifier.toString(c.getModifiers())); System.out.println("Parameters: " + c.getParameterCount()); System.out.println(); } } catch (Exception e) { e.printStackTrace(); } } }
Вывод:
Constructor Name: Dog Modifier: public Parameters: 0 Constructor Name: Dog Modifier: private Parameters: 1
Для дальнейших деталей см. документацию Constructor.
java
- Ключевое слово final в Java: переменные, методы и классы
- Оператор instanceof в Java: полное руководство с примерами
- Наследование в Java: концепции, типы и практические примеры
- Статические вложенные классы в Java: использование, отличия и примеры
- Анонимные внутренние классы в Java: определение, синтаксис и практические примеры
- Паттерн Singleton в Java: как реализовать и безопасно использовать
- Мастерство Java ArrayList: операции, методы и лучшие практики
- Освоение Java ObjectOutputStream: сериализация, методы и практические примеры
- Освоение Java Generics: создание переиспользуемого, типобезопасного кода
- Мастерство файловых операций в Java с java.io: создание, чтение, запись и удаление