Класс MethodHandleProxies
- java.lang.Object
-
- java.lang.invoke.MethodHandleProxies
public class MethodHandleProxies extends Object
Этот класс состоит исключительно из статических методов, которые помогают адаптировать обработчики методов к другим типам JVM, таким как интерфейсы.
- С момента:
- 1.7
Методы
| Модификатор и тип | Метод | Описание |
|---|---|---|
static <T> T | asInterfaceInstance(Class<T> intfc,
MethodHandle target) | Создаёт экземпляр заданного интерфейса с одним методом, который перенаправляет вызовы на заданный обработчик методов. |
static boolean | isWrapperInstance(Object x) | Определяет, был ли данный объект создан вызовом |
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 могут также оснастить экземпляры обёртки одним или несколькими дополнительными публичными интерфейсами-маркерами.
Если установлен менеджер безопасности, этот метод чувствителен к вызывающему объекту. Во время любого вызова целевого обработчика методов через возвращаемую обёртку, исходный создатель обёртки (вызывающий объект) будет виден для проверок контекста, запрошенных менеджером безопасности.
- Параметры типов:
T— желаемый тип обёртки, интерфейс с одним методом- Параметры:
intfc— объект класса, представляющийTtarget— обработчик методов для вызова из обёртки- Возвращает:
- правильно типизированную обёртку для заданного целевого объекта
- Исключения:
NullPointerException— если любой из аргументов равен nullIllegalArgumentException— если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, 2020, 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/11/docs/api/java.base/java/lang/invoke/MethodHandleProxies.html