Класс BeansLinker
- Все реализованные интерфейсы:
GuardingDynamicLinker
public class BeansLinker extends Object implements GuardingDynamicLinker
DynamicLinkerFactory, чтобы предоставить возможность связывать вызовы к всем объектам, которые не были распознаны другими обработчиками. Конкретно, этот обработчик: - если объект является
record, выставляет все публичные методы доступа к компонентам записи в качестве свойств-геттеров для операцийStandardOperation.GETв пространстве имёнStandardNamespace.PROPERTY; - выставляет все публичные методы вида
setXxx(),getXxx(), иisXxx()в качестве свойств-сеттеров и геттеров для операцийStandardOperation.SETиStandardOperation.GETв пространстве имёнStandardNamespace.PROPERTY, за исключением геттеров для свойств с именами, уже обработанными геттерами компонентов записи; - выставляет все публичные методы для получения значений для операции
StandardOperation.GETв пространстве имёнStandardNamespace.METHOD; полученные таким образом методы могут затем быть вызваны с помощьюStandardOperation.CALL. - выставляет все публичные поля как свойства, если для них не определены геттеры или сеттеры с тем же именем;
- выставляет элементы нативных Java-массивов,
ListиMapобъектов в качестве операцийStandardOperation.GETиStandardOperation.SETв пространстве имёнStandardNamespace.ELEMENT; - выставляет удаление элементов из
ListиMapобъектов в качестве операцииStandardOperation.REMOVEв пространстве имёнStandardNamespace.ELEMENT; - выставляет виртуальное свойство, названное
lengthдля Java-массивов,CollectionиMapобъектов; - выставляет
StandardOperation.NEWдля экземпляровStaticClassкак вызовы конструкторов, включая те объекты статических классов, которые представляют Java-массивы (их конструкторы принимают единственныйintпараметр, представляющий длину создаваемого массива); - выставляет статические методы, поля и свойства классов аналогичным образом, как это делается для методов, полей и свойств экземпляров, на объектах
StaticClass. - выставляет виртуальное свойство, названное
staticна экземплярахClassдля доступа к ихStaticClass.
Разрешение перегруженных методов выполняется автоматически для свойств-сеттеров, методов и конструкторов. Кроме того, ручное разрешение перегруженных методов поддерживается путем указания имени метода с явной сигнатурой в месте вызова, например, StandardOperation.GET.withNamespace(METHOD).named("parseInt(String,int)"). В таких сигнатурах можно использовать имена классов без указания пакетов, они будут соответствовать любому классу с таким же именем без пакета. Вам необходимо использовать полное имя класса только в случае, если имена классов без пакета приведут к неоднозначности выбора (это случается крайне редко). Автоматическое разрешение перегрузки для конструкторов не поддерживается, так как нет логического места для добавления этой функциональности, но если язык хочет предоставить эту функциональность, он может использовать getConstructorMethod(Class, String) в качестве полезного строительного блока.
Вызов методов с переменным числом аргументов обрабатывается как для методов, так и для конструкторов.
Методы, чувствительные к вызывающей стороне могут быть связаны, при условии, что они являются публичными и запросы на связь содержат описатели места вызова с полноценными объектами MethodHandles.Lookup, а не ослабленными поисками или публичным поиском.
Поведение при обработке отсутствующих членов можно настроить, передав MissingMemberHandlerFactory в constructor.
Класс также предоставляет различные методы для поиска доступных имен свойств и методов в классах и экземплярах классов, а также для доступа к обработчикам связей по классам с помощью метода getLinkerForClass(Class).
Краткое описание конструкторов
| Конструктор | Описание |
|---|---|
BeansLinker() |
Создаёт новый обработчик связей для объектов. |
BeansLinker |
Создаёт новый обработчик связей с заданным фабричным методом для создания обработчиков отсутствующих членов. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
static Object |
getConstructorMethod |
Возвращает динамический метод конструктора заданного класса и заданной сигнатуры. |
GuardedInvocation |
getGuardedInvocation |
Создаёт защищённый вызов, подходящий для конкретного вызова с указанными аргументами в месте вызова. |
static Set |
getInstanceMethodNames |
Возвращает набор имён всех методов экземпляров класса. |
TypeBasedGuardingDynamicLinker |
getLinkerForClass |
Возвращает обработчик связей для конкретного класса. |
static Set |
getReadableInstancePropertyNames |
Возвращает набор имён всех читаемых свойств экземпляра класса. |
static Set |
getReadableStaticPropertyNames |
Возвращает набор имён всех читаемых статических свойств класса. |
static Set |
getStaticMethodNames |
Возвращает набор имён всех статических методов класса. |
static Set |
getWritableInstancePropertyNames |
Возвращает набор имён всех записываемых свойств экземпляра класса. |
static Set |
getWritableStaticPropertyNames |
Возвращает набор имён всех записываемых статических свойств класса. |
static boolean |
isDynamicConstructor |
Возвращает true, если объект является Java-конструктором (получен с помощью getConstructorMethod(Class, String)}. |
static boolean |
isDynamicMethod |
Возвращает true, если объект является динамическим методом Java (например, полученный с помощью операции GET:METHOD над Java-объектом или StaticClass или с помощью getConstructorMethod(Class, String). |
Подробное описание конструкторов
BeansLinker
public BeansLinker()
BeansLinker(MissingMemberHandlerFactory) с null в качестве фабрики обработчиков отсутствующих членов, что приводит к поведению по умолчанию для связывания и оценки отсутствующих членов.BeansLinker
public BeansLinker(MissingMemberHandlerFactory missingMemberHandlerFactory)
MissingMemberHandlerFactory для получения подробной информации.- Параметры:
-
missingMemberHandlerFactory- фабрика для создания обработчиков операций с отсутствующими членами.
Подробное описание методов
getLinkerForClass
public TypeBasedGuardingDynamicLinker getLinkerForClass(Class<?> clazz)
- Параметры:
-
clazz- класс - Возвращает:
- обработчик связывания для этого класса
isDynamicMethod
public static boolean isDynamicMethod(Object obj)
GET:METHOD операции над объектом Java или StaticClass или через getConstructorMethod(Class, String).- Параметры:
-
obj- объект, который мы хотим проверить на наличие динамического метода Java. - Возвращает:
- true, если это динамический метод, false в противном случае.
isDynamicConstructor
public static boolean isDynamicConstructor(Object obj)
getConstructorMethod(Class, String)).- Параметры:
-
obj- объект, который мы хотим проверить на наличие конструктора Java. - Возвращает:
- true, если это конструктор, false в противном случае.
getConstructorMethod
public static Object getConstructorMethod(Class<?> clazz, String signature)
StaticClass действуют как перегруженные конструкторы без явного выбора сигнатуры. Пример использования: getConstructorMethod(java.awt.Color.class, "int, int, int").- Параметры:
-
clazz- класс -
signature- полная сигнатура конструктора. Обратите внимание, как можно использовать имена примитивных типов, имена массивов с обычной нотацией Java (например,"int[]") и обычно можно даже использовать имена классов без квалификаторов (например,"String, List"вместо"java.lang.String, java.util.List", пока это не приводит к неоднозначности в определенной позиции параметра). - Возвращает:
- динамический метод для конструктора или null, если конструктор с заданной сигнатурой не существует.
getReadableInstancePropertyNames
public static Set<String> getReadableInstancePropertyNames(Class<?> clazz)
- Параметры:
-
clazz- класс - Возвращает:
- множество имён всех доступных свойств экземпляров класса.
getWritableInstancePropertyNames
public static Set<String> getWritableInstancePropertyNames(Class<?> clazz)
- Параметры:
-
clazz- класс - Возвращает:
- множество имён всех записываемых свойств экземпляров класса.
getInstanceMethodNames
public static Set<String> getInstanceMethodNames(Class<?> clazz)
- Параметры:
-
clazz- класс - Возвращает:
- множество имён всех методов экземпляров класса.
getReadableStaticPropertyNames
public static Set<String> getReadableStaticPropertyNames(Class<?> clazz)
- Параметры:
-
clazz- класс - Возвращает:
- множество имён всех доступных статических свойств класса.
getWritableStaticPropertyNames
public static Set<String> getWritableStaticPropertyNames(Class<?> clazz)
- Параметры:
-
clazz- класс - Возвращает:
- множество имён всех записываемых статических свойств класса.
getStaticMethodNames
public static Set<String> getStaticMethodNames(Class<?> clazz)
- Параметры:
-
clazz- класс - Возвращает:
- множество имён всех статических методов класса.
getGuardedInvocation
public GuardedInvocation getGuardedInvocation(LinkRequest request, LinkerServices linkerServices) throws Exception
GuardingDynamicLinker- Определено в:
-
getGuardedInvocationв интерфейсеGuardingDynamicLinker - Параметры:
-
request- объект, описывающий запрос на связывание конкретного вызова -
linkerServices- сервисы связывания - Возвращает:
- защищённый вызов с методом обработки, подходящим для аргументов, а также условием защиты, которое, если оно не выполняется, должно инициировать повторное связывание. Должен вернуть null, если не может разрешить вызов. Если возвращаемый вызов безусловный (что на самом деле довольно редко), защита в возвращаемом значении может быть null. Вызов также может иметь любое количество точек переключения для асинхронной проверки подлинности связи, а также подкласс
Throwable, описывающий ожидаемое условие исключения, которое также инициирует повторное связывание (часто быстрее полагаться на редкое, но ожидаемоеClassCastException, чем на всегда оцениваемоеinstanceofусловие защиты). Хотя обработчик связывания должен создать вызов с типами параметров, соответствующими описанию места вызова запроса на связывание, он не должен пытаться сопоставить ожидаемый тип возвращаемого значения в месте вызова, за исключением случаев, когда он может сделать это только с преобразованиями, которые не теряют ни точности, ни величины, см.LinkerServices.asTypeLosslessReturn(MethodHandle, MethodType)для дополнительного объяснения. - Исключения:
-
Exception- если операция завершается неудачно по любой причине
© 1993, 2023, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/21/docs/api/jdk.dynalink/jdk/dynalink/beans/BeansLinker.html