Spec-Zone.ru › OpenJDK 25

Класс MethodHandleProxies

java.lang.Object
java.lang.invoke.MethodHandleProxies
public final class MethodHandleProxies extends Object
Этот класс состоит исключительно из статических методов, помогающих адаптировать дескрипторы методов к другим типам JVM, таким как интерфейсы.
С версии:
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)
Восстанавливает тип интерфейса с единственным методом, для которого был создан этот экземпляр-обертка.

Методы, объявленные в классе 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 экземпляры-обертки также могут быть снабжены одним или несколькими дополнительными общедоступными интерфейсами-маркерами.

Параметры типа:
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 не указывает на экземпляр-обертку

Сообщить об ошибке или предложить улучшение
Дополнительную справочную информацию по API и документацию для разработчиков см. в разделе документации Java SE, содержащем более подробные описания для разработчиков, тематические обзоры, определения терминов, обходные решения и примеры работающего кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или ее филиалов в США и других странах.
Авторское право © 1993, 2025, Oracle и/или ее филиалы, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
Все права защищены. Использование регулируется условиями лицензии и политикой распространения документации.

© 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

Spec-Zone.ru

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