Spec-Zone.ru › OpenJDK 24

Класс 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, 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://download.java.net/java/early_access/jdk24/docs/api/java.base/java/lang/invoke/MethodHandleProxies.html

Spec-Zone.ru

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