Класс MethodHandleProxies
public final class MethodHandleProxies extends Object
- С версии:
- 1.7
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
static <T> T |
asInterfaceInstance |
Создает экземпляр заданного интерфейса с единственным методом, перенаправляющий вызовы к заданному дескриптору метода. |
static boolean |
isWrapperInstance |
Определяет, был ли заданный объект создан вызовом asInterfaceInstance. |
static MethodHandle |
wrapperInstanceTarget |
Создает или восстанавливает целевой дескриптор метода, поведение которого эквивалентно уникальному методу этого экземпляра-обертки. |
static Class |
wrapperInstanceType |
Восстанавливает тип интерфейса с единственным методом, для которого был создан этот экземпляр-обертка. |
Подробное описание методов
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 экземпляры-обертки также могут быть снабжены одним или несколькими дополнительными общедоступными интерфейсами-маркерами.
- Параметры типа:
T— требуемый тип обертки, интерфейс с единственным методом- Параметры:
-
intfc— объект класса, представляющийT -
target— дескриптор метода, вызываемый из обертки - Возвращает:
- обертку заданной целевой функции с соответствующим типом
- Выбрасывает:
-
NullPointerException— если любой из аргументов равен null -
IllegalArgumentException— еслиintfcне является допустимым аргументом этого метода -
WrongMethodTypeException— если целевую функцию нельзя преобразовать к типу, требуемому запрошенным интерфейсом
isWrapperInstance
public static boolean isWrapperInstance(Object x)
asInterfaceInstance.- Параметры:
-
x— любая ссылка - Возвращает:
- true, если ссылка не равна null и указывает на объект, созданный методом
asInterfaceInstance
wrapperInstanceTarget
public static MethodHandle wrapperInstanceTarget(Object x)
x должен быть создан вызовом asInterfaceInstance. Это требование можно проверить с помощью isWrapperInstance.- Параметры:
-
x— любая ссылка - Возвращает:
- дескриптор метода, реализующий уникальный метод
- Выбрасывает:
-
IllegalArgumentException— если ссылка x не указывает на экземпляр-обертку
wrapperInstanceType
public static Class<?> wrapperInstanceType(Object x)
x должен быть создан вызовом asInterfaceInstance. Это требование можно проверить с помощью isWrapperInstance.- Параметры:
-
x— любая ссылка - Возвращает:
- тип интерфейса с единственным методом, для которого была создана обертка
- Выбрасывает:
-
IllegalArgumentException— если ссылка x не указывает на экземпляр-обертку
© 1993, 2025, 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/25/docs/api/java.base/java/lang/invoke/MethodHandleProxies.html