Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> java

Рефлексия в Java: инспекция классов, методов и полей во время выполнения

Мастерство рефлексии в Java

Узнайте, как API рефлексии Java позволяет инспектировать и модифицировать классы, методы, поля и конструкторы во время выполнения, повышая гибкость и обеспечивая мощные динамические поведения.

В Java рефлексия позволяет изучать и манипулировать классами, интерфейсами, конструкторами, методами и полями пока программа выполняется.

Java предоставляет класс Class, инкапсулирующий метаданные о классе или интерфейсе. Экземпляр Class — это шлюз к возможностям рефлексии.


Получение объекта Class

Для выполнения рефлексии сначала нужен объект Class. Есть три распространенных способа получить его:

  1. Использование Class.forName()
    Class<Dog> clazz = Class.forName("com.example.Dog");

    Метод принимает полное имя класса и загружает его, если он еще не загружен.

  2. Использование getClass() на экземпляре
    Dog dog = new Dog(); Class<Dog> clazz = dog.getClass();

    Получает класс объекта во время выполнения.

  3. Использование литерала .class
    Class<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 раскрывает метаданные, такие как имя, тип возвращаемого значения и модификаторы. Ниже приведен краткий пример:

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

  1. Ключевое слово final в Java: переменные, методы и классы
  2. Оператор instanceof в Java: полное руководство с примерами
  3. Наследование в Java: концепции, типы и практические примеры
  4. Статические вложенные классы в Java: использование, отличия и примеры
  5. Анонимные внутренние классы в Java: определение, синтаксис и практические примеры
  6. Паттерн Singleton в Java: как реализовать и безопасно использовать
  7. Мастерство Java ArrayList: операции, методы и лучшие практики
  8. Освоение Java ObjectOutputStream: сериализация, методы и практические примеры
  9. Освоение Java Generics: создание переиспользуемого, типобезопасного кода
  10. Мастерство файловых операций в Java с java.io: создание, чтение, запись и удаление