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