Spec-Zone.ru › OpenJDK 17

Класс 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, 2021, 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/17/docs/api/java.base/java/lang/invoke/MethodHandleProxies.html

Spec-Zone.ru

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