Углубленное понимание встроенных классов инструментов Spring Boot: ReflectionUtils.
Углубленное понимание встроенных классов инструментов Spring Boot: ReflectionUtils.
Каталог статей

    • 1. Что такое отражение?
    • 2. Используйте ReflectionUtils
      • 2.1 Получить все поля класса
      • 2.2 Методы вызова
      • 2.3 Поля доступа
    • 3. Анализ исходного кода
      • 3.1 `doWithFields`
      • 3.2 `findMethod`
      • 3.3 `invokeMethod`
    • 4. Расширение и анализ
      • 4.1 Расширение
      • 4.2 Вопросы производительности
      • 4.3 Модульность Java 9+
    • 5. Резюме

🎉Добро пожаловать в Архитектурный дизайн Столбец~Углубленное понимание встроенных классов инструментов Spring Boot: ReflectionUtils.



Spring Boot как мощный Java-фреймворк,Предоставляет множество инструментов и методов, облегчающих разработку. в,ReflectionUtilsэтоотражение Инструменты,Он инкапсулирует операции Javaотражения.,Позволяет нам более легко работать и получать доступ к методам класса.、поля и т. д.。В этой статье будет подробно рассмотреноReflectionUtilsИспользование、принцип,и объяснить и продемонстрировать с помощью соответствующей вставки кода,Помогите читателям лучше понять и использовать эти Инструменты.

1. Что такое отражение?

отражение означает, что программа запущена,Возможность динамически получать информацию о классе и управлять свойствами, методами и конструкторами класса. на Явесередина,может пройтиjava.lang.reflectреализация пакетаотражение。отражение Основные области применения включают:

  • Получите информацию о классе во время выполнения.
  • Получите свойства, методы, конструкторы и т. д. класса во время выполнения.
  • Вызов методов объекта во время выполнения.
  • Генерируйте новые классы во время выполнения.

ReflectionUtilsто естьSpring Boot инкапсулирует отражение Java и предоставляет более простой API, позволяющий разработчикам более удобно выполнять операции отражения.

2. Используйте ReflectionUtils

ReflectionUtilsСодержит ряд статических методов.,используется для выполнения обычныхотражениедействовать。Вот несколько примеров, показывающих, какиспользоватьReflectionUtils

2.1 Получить все поля класса
Язык кода:javascript
копировать
import org.springframework.util.ReflectionUtils;

public class ReflectionExample {

    public static void main(String[] args) {
        Class<?> clazz = MyClass.class;

        ReflectionUtils.doWithFields(clazz, field -> {
            System.out.println("Field: " + field.getName());
        });
    }

    private static class MyClass {
        private String name;
        private int age;
    }
}

В приведенном выше примере,мы проходимReflectionUtils.doWithFieldsМетод пересекаетMyClassВсе поля класса,и распечатывает имя поля.

2.2 Методы вызова
Язык кода:javascript
копировать
import org.springframework.util.ReflectionUtils;

import java.lang.reflect.Method;

public class ReflectionExample {

    public static void main(String[] args) {
        MyClass myClass = new MyClass();
        Class<?> clazz = myClass.getClass();

        Method method = ReflectionUtils.findMethod(clazz, "printInfo");
        if (method != null) {
            ReflectionUtils.invokeMethod(method, myClass);
        }
    }

    private static class MyClass {
        public void printInfo() {
            System.out.println("Printing information...");
        }
    }
}

В этом примере,насиспользоватьReflectionUtils.findMethodНашел этоprintInfoметод,и пройтиReflectionUtils.invokeMethodЭтот метод назывался。

2.3 Поля доступа
Язык кода:javascript
копировать
import org.springframework.util.ReflectionUtils;

import java.lang.reflect.Field;

public class ReflectionExample {

    public static void main(String[] args) {
        MyClass myClass = new MyClass();
        Class<?> clazz = myClass.getClass();

        Field field = ReflectionUtils.findField(clazz, "name");
        if (field != null) {
            ReflectionUtils.makeAccessible(field);
            ReflectionUtils.setField(field, myClass, "John Doe");
            System.out.println("Name: " + ReflectionUtils.getField(field, myClass));
        }
    }

    private static class MyClass {
        private String name;
    }
}

В приведенном выше коде,мы проходимReflectionUtils.findFieldНашел этоnameПоле,ииспользоватьReflectionUtils.makeAccessibleделать Поледоступный。Затем,проходитьReflectionUtils.setFieldнастраивать Понятно Полеизценить,проходитьReflectionUtils.getFieldполучать Понятно Полеизценить。

3. Анализ исходного кода

ReflectionUtilsизвыполнитьпринцип В основном на основеJavaизотражениемеханизм。существоватьReflectionUtilsсередина,Есть несколько важных методов,напримерdoWithFieldsfindMethodinvokeMethodждать。Ниже приводится краткий анализ егосерединаизнесколькометод。

3.1 doWithFields
Язык кода:javascript
копировать
public static void doWithFields(Class<?> clazz, FieldCallback fieldCallback) {
    doWithFields(clazz, fieldCallback, null);
}

public static void doWithFields(Class<?> clazz, FieldCallback fieldCallback, FieldFilter fieldFilter) {
    // ...
    ReflectionUtils.MethodFilter allMethods = ReflectionUtils.MethodFilter.TRUE;
    doWithFields(clazz, fieldCallback, fieldFilter, allMethods);
}

Этот метод используется для обхода всех полей класса.,проходитьвызовdoWithFieldsиз Различные перегрузкиметод,может быть доставленFieldCallbackFieldFilter иMethodFilterждатьпараметр。

3.2 findMethod
Язык кода:javascript
копировать
@Nullable
public static Method findMethod(Class<?> clazz, String name) {
    return findMethod(clazz, name, EMPTY_CLASS_ARRAY);
}

@Nullable
public static Method findMethod(Class<?> clazz, String name, Class<?>... paramTypes) {
    // ...
    Method[] methods = clazz.getDeclaredMethods();
    for (Method method : methods) {
        if (name.equals(method.getName()) &&
                (paramTypes.length == 0 || Arrays.equals(paramTypes, method.getParameterTypes()))) {
            return method;
        }
    }
    return null;
}

findMethodметод Используется для поиска определенного имениипараметр类型изметод。этопроходитьвызовclazz.getDeclaredMethods()получать所有заявлениеизметод,а затем перебрать эти методы,Сравните имена методов и типы параметров.

3.3 invokeMethod
Язык кода:javascript
копировать
public static Object invokeMethod(Method method, @Nullable Object target, Object... args) {
    try {
        return method.invoke(target, args);
    } catch (Exception ex) {
        handleReflectionException(ex);
    }
    throw new IllegalStateException("Should never get here");
}

invokeMethodметод用于вызов指定对象изметод。он вызывает напрямуюmethod.invokeвыполнитьметод,Вызывается, если возникает исключениеhandleReflectionExceptionПроцесс。

4. Расширение и анализ

4.1 Расширение

Помимо нескольких распространенных методов, представленных выше,,ReflectionUtilsТакже доступен Понятнодругой一些有用изметод,нравитьсяdoWithMethodsdeclaredFieldsждать。Может основываться на конкретныхизнуждаться,Используйте эти методы гибко.

4.2 Вопросы производительности

Поскольку отражение включает в себя такие операции, как динамическое получение информации о классе и динамическое создание объектов, издержки производительности относительно велики. В сценариях, чувствительных к производительности, отражение следует использовать с осторожностью и более прямым образом.

4.3 Модульность Java 9+

на Яве В версиях 9 и выше введение модульности оказало некоторое влияние на рефлексию. Если в проекте используется Java Версия 9 и выше,ииспользовать Понятно Модульный,может понадобитьсясуществоватьmodule-info.javaсередина Добавить соответствующийиз--add-opensзаявление,Чтобы гарантировать, что отражение может правильно получить доступ к внутренним компонентам определенных модулей.

5. Резюме

В этой статье подробно рассматривается Spring. Bootвстроенныйотражение ИнструментыReflectionUtilsизиспользоватьметоди Исходный кодпринцип。проходить Демонстрация примера кода Понятнонравиться Какой класс обходаиз Поле、Найти метод、метод вызоваждатьдействовать。в то же время,Анализируются некоторые соображения по поводу расширения и производительности. отражение — одна из мощных функций Java.,Однако во время путешествий необходимо уделять внимание вопросам производительности и безопасности.,Тщательно выбирайте сцены.

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose