🎉Добро пожаловать в Архитектурный дизайн Столбец~Углубленное понимание встроенных классов инструментов Spring Boot: ReflectionUtils.
Spring Boot как мощный Java-фреймворк,Предоставляет множество инструментов и методов, облегчающих разработку. в,ReflectionUtils
этоотражение Инструменты,Он инкапсулирует операции Javaотражения.,Позволяет нам более легко работать и получать доступ к методам класса.、поля и т. д.。В этой статье будет подробно рассмотреноReflectionUtils
Использование、принцип,и объяснить и продемонстрировать с помощью соответствующей вставки кода,Помогите читателям лучше понять и использовать эти Инструменты.
отражение означает, что программа запущена,Возможность динамически получать информацию о классе и управлять свойствами, методами и конструкторами класса. на Явесередина,может пройтиjava.lang.reflect
реализация пакетаотражение。отражение Основные области применения включают:
ReflectionUtils
то естьSpring Boot инкапсулирует отражение Java и предоставляет более простой API, позволяющий разработчикам более удобно выполнять операции отражения.
ReflectionUtils
Содержит ряд статических методов.,используется для выполнения обычныхотражениедействовать。Вот несколько примеров, показывающих, какиспользоватьReflectionUtils
。
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
Все поля класса,и распечатывает имя поля.
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
Этот метод назывался。
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
получать Понятно Полеизценить。
ReflectionUtils
извыполнитьпринцип В основном на основеJavaизотражениемеханизм。существоватьReflectionUtils
середина,Есть несколько важных методов,напримерdoWithFields
、findMethod
、invokeMethod
ждать。Ниже приводится краткий анализ егосерединаизнесколькометод。
doWithFields
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
из Различные перегрузкиметод,может быть доставленFieldCallback
、FieldFilter
иMethodFilter
ждатьпараметр。
findMethod
@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()
получать所有заявлениеизметод,а затем перебрать эти методы,Сравните имена методов и типы параметров.
invokeMethod
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
Процесс。
Помимо нескольких распространенных методов, представленных выше,,ReflectionUtils
Также доступен Понятнодругой一些有用изметод,нравитьсяdoWithMethods
、declaredFields
ждать。Может основываться на конкретныхизнуждаться,Используйте эти методы гибко.
Поскольку отражение включает в себя такие операции, как динамическое получение информации о классе и динамическое создание объектов, издержки производительности относительно велики. В сценариях, чувствительных к производительности, отражение следует использовать с осторожностью и более прямым образом.
на Яве В версиях 9 и выше введение модульности оказало некоторое влияние на рефлексию. Если в проекте используется Java Версия 9 и выше,ииспользовать Понятно Модульный,может понадобитьсясуществоватьmodule-info.java
середина Добавить соответствующийиз--add-opens
заявление,Чтобы гарантировать, что отражение может правильно получить доступ к внутренним компонентам определенных модулей.
В этой статье подробно рассматривается Spring. Bootвстроенныйотражение ИнструментыReflectionUtils
изиспользоватьметоди Исходный кодпринцип。проходить Демонстрация примера кода Понятнонравиться Какой класс обходаиз Поле、Найти метод、метод вызоваждатьдействовать。в то же время,Анализируются некоторые соображения по поводу расширения и производительности. отражение — одна из мощных функций Java.,Однако во время путешествий необходимо уделять внимание вопросам производительности и безопасности.,Тщательно выбирайте сцены.