Spec-Zone.ru › OpenJDK 21

Класс MethodHandleProxies

java.lang.Object
java.lang.invoke.MethodHandleProxies
public class MethodHandleProxies extends Object
Этот класс состоит исключительно из статических методов, которые помогают адаптировать обработчики методов к другим типам JVM, таким как интерфейсы.
Since:
1.7

Краткое описание методов

Модификатор и тип Метод Описание
static <T> T asInterfaceInstance(Class<T> intfc, MethodHandle target)
Создаёт экземпляр заданного интерфейса с единственным методом, который перенаправляет вызовы на заданный обработчик методов.
static boolean isWrapperInstance(Object x)
Определяет, был ли данный объект создан вызовом asInterfaceInstance.
static MethodHandle wrapperInstanceTarget(Object x)
Создаёт или восстанавливает целевой обработчик методов, который поведением эквивалентен единственному методу этого обернутого экземпляра.
static Class<?> wrapperInstanceType(Object x)
Восстанавливает уникальный тип интерфейса с единственным методом, для которого был создан этот обернутый экземпляр.

Методы, унаследованные от класса java.lang.Object

clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

Подробное описание методов

asInterfaceInstance

public static <T> T asInterfaceInstance(Class<T> intfc, MethodHandle target)
Создаёт экземпляр заданного интерфейса с единственным методом, который перенаправляет вызовы на заданный обработчик методов.

Интерфейс с единственным методом - это интерфейс, который объявляет уникальный метод. При определении уникального метода интерфейса с единственным методом публичные Object методы (toString, equals, hashCode) игнорируются, как и любые стандартные (не абстрактные) методы. Например, Comparator является интерфейсом с единственным методом, даже если он повторно объявляет метод Object.equals и также объявляет стандартные методы, такие как Comparator.reverse.

Интерфейс должен быть публичным и не герметичным. Дополнительные проверки доступа не выполняются.

Возвращаемый экземпляр требуемого типа будет реагировать на вызов одноимённого метода типа, вызвав указанный целевой обработчик на входных аргументах и вернув или бросив то, что возвращает или бросает целевой обработчик. Вызов будет осуществлён как если бы был вызов target.invoke. Тип целевого обработчика будет проверен перед созданием экземпляра, как если бы был вызов asType, что может привести к WrongMethodTypeException.

Уникальному методу разрешается быть многократно объявленным с разными описаниями типов. (Например, он может быть перегружен или может обладать методами-мостами.) Все такие объявления связаны напрямую с целевым обработчиком методов. Аргументы и возвращаемые типы корректируются asType для каждого отдельного объявления.

Экземпляр обёртки будет реализовывать запрашиваемый интерфейс и его надтипы, но не другие интерфейсы с единственным методом. Это означает, что экземпляр не пройдёт неожиданно instanceof тест для любого не требуемого типа.

Примечание реализации: Следовательно, каждый экземпляр должен реализовывать уникальный интерфейс с единственным методом. Реализации не могут объединять несколько интерфейсов с единственным методом на единые классы реализации в стиле AWTEventMulticaster.

Обработчик методов может бросить необъявленное исключение, что означает любое проверяемое исключение (или другое проверяемое исключительное событие), не объявленное в абстрактном единственном методе запрошенного типа. Если это произойдёт, исключительное событие будет обернуто в экземпляр UndeclaredThrowableException и брошено в этом обернутом виде.

Подобно Integer.valueOf, asInterfaceInstance является фабричным методом, результаты которого определяются их поведением. Не гарантируется, что будет возвращён новый экземпляр при каждом вызове.

Из-за возможности методов-мостов и других частных случаев, интерфейс также может иметь несколько абстрактных методов с одинаковым именем, но имеющими разные описания (типы возвращаемых значений и параметров). В этом случае все такие методы привязаны общим образом к одному заданному целевому обработчику. Проверка типа и эффективное asType преобразование применяется к каждому описанию типа метода, и все абстрактные методы привязаны к целевому обработчику общим образом. Помимо этой проверки типа, не производится дальнейшая проверка для определения того, что абстрактные методы каким-либо образом связаны.

Будущие версии API могут принять дополнительные типы, такие как абстрактные классы с единственным абстрактным методом. Будущие версии API также могут снабдить экземпляры обёртки одним или несколькими дополнительными публичными интерфейсами-маркерами.

Если установлена система безопасности, этот метод чувствителен к вызывающему объекту. При любом вызове целевого обработчика методов через возвращённую обёртку оригинальный создатель обёртки (вызывающий объект) будет виден для проверок контекста, запрашиваемых системой безопасности.

Type Parameters:
T - желаемый тип обёртки, интерфейс с единственным методом
Parameters:
intfc - объект класса, представляющий T
target - обработчик методов для вызова из обёртки
Returns:
правильно типизированная обёртка для данного целевого обработчика
Throws:
NullPointerException - если любой из аргументов равен null
IllegalArgumentException - если intfc не является допустимым аргументом для этого метода
WrongMethodTypeException - если целевой обработчик не может быть преобразован в тип, требуемый запрошенным интерфейсом

isWrapperInstance

public static boolean isWrapperInstance(Object x)
Определяет, был ли данный объект создан вызовом asInterfaceInstance.
Parameters:
x - любая ссылка
Returns:
true, если ссылка не null и указывает на объект, созданный вызовом asInterfaceInstance

wrapperInstanceTarget

public static MethodHandle wrapperInstanceTarget(Object x)
Создаёт или восстанавливает целевой обработчик методов, который поведением эквивалентен единственному методу этого экземпляра обёртки. Объект x должен был быть создан вызовом asInterfaceInstance. Это требование может быть проверено с помощью isWrapperInstance.
Parameters:
x - любая ссылка
Returns:
обработчик методов, реализующий уникальный метод
Throws:
IllegalArgumentException - если ссылка x не указывает на экземпляр обёртки

wrapperInstanceType

public static Class<?> wrapperInstanceType(Object x)
Восстанавливает уникальный тип интерфейса с единственным методом, для которого был создан этот экземпляр обёртки. Объект x должен был быть создан вызовом asInterfaceInstance. Это требование может быть проверено с помощью isWrapperInstance.
Parameters:
x - любая ссылка
Returns:
тип интерфейса с единственным методом, для которого была создана обёртка
Throws:
IllegalArgumentException - если ссылка x не указывает на экземпляр обёртки

© 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/java.base/java/lang/invoke/MethodHandleProxies.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API