Интерфейс MethodHandleInfo
public interface MethodHandleInfo
Символьная ссылка, полученная путем раскрытия прямого обработчика метода до его составляющих символьных частей. Для раскрытия прямого обработчика метода вызовите Lookup.revealDirect.
Прямые обработчики методов
Прямой обработчик метода представляет метод, конструктор или поле без каких-либо промежуточных привязок аргументов или других преобразований. Метод, конструктор или поле, к которому относится прямой обработчик метода, называется его основным членом. Прямые обработчики методов могут быть получены следующими способами:- Выполняя инструкцию
ldcнад константойCONSTANT_MethodHandle. (См. спецификацию Java Virtual Machine, разделы 4.4.8 и 5.4.3.) - Вызвав один из методов-фабрик методов Lookup, таких как
Lookup.findVirtual, для разрешения символьной ссылки в обработчик метода. Символьная ссылка состоит из класса, имени строки и типа. - Вызвав метод-фабрику
Lookup.unreflectилиLookup.unreflectSpecialдля преобразованияMethodв обработчик метода. - Вызвав метод-фабрику
Lookup.unreflectConstructorдля преобразованияConstructorв обработчик метода. - Вызвав метод-фабрику
Lookup.unreflectGetterилиLookup.unreflectSetterдля преобразованияFieldв обработчик метода.
Ограничения при раскрытии
При наличии подходящего объектаLookup, можно раскрыть любой прямой обработчик метода для восстановления символьной ссылки на основной метод, конструктор или поле. Раскрытие должно выполняться с помощью объекта Lookup, эквивалентного объекту, который создал целевой обработчик метода, или имеющего достаточные разрешения доступа для воссоздания эквивалентного обработчика метода.
Если основной метод является чувствительным к вызывающему, прямой обработчик метода будет "привязан" к определённому классу вызывающего, классу поиска объекта поиска, использованного для его создания. Попытка раскрыть этот обработчик метода с другим классом поиска завершится ошибкой, даже если основной метод является публичным (например, Class.forName).
Требование соответствия объекта поиска обеспечивает быстрое отсечение для программ, которые иначе могли бы доверять ошибочному раскрытию обработчика метода с символьной информацией (или привязкой вызывающего) из неожиданного контекста. Используйте MethodHandles.reflectAs(java.lang.Class<T>, java.lang.invoke.MethodHandle) для отмены этого ограничения.
Виды ссылок
Методы-фабрики Lookup соответствуют всем основным сценариям использования методов, конструкторов и полей. Эти сценарии могут быть различимы с помощью небольших целых чисел следующим образом:| вид ссылки | описательное имя | область | член | поведение |
|---|---|---|---|---|
1 |
REF_getField |
class | FT f; |
(T) this.f; |
2 |
REF_getStatic |
class или interface
|
staticFT f;
|
(T) C.f; |
3 |
REF_putField |
class | FT f; |
this.f = x; |
4 |
REF_putStatic |
class |
staticFT f;
|
C.f = arg; |
5 |
REF_invokeVirtual |
class | T m(A*); |
(T) this.m(arg*); |
6 |
REF_invokeStatic |
class или interface
|
staticT m(A*);
|
(T) C.m(arg*); |
7 |
REF_invokeSpecial |
class или interface
| T m(A*); |
(T) super.m(arg*); |
8 |
REF_newInvokeSpecial |
class | C(A*); |
new C(arg*); |
9 |
REF_invokeInterface |
interface | T m(A*); |
(T) this.m(arg*); |
- С:
- 1.8
Поля
| Модификатор и тип | Поле | Описание |
|---|---|---|
static int | REF_getField | Вид ссылки прямого обработчика метода, как определено в таблице выше. |
static int | REF_getStatic | Вид ссылки прямого обработчика метода, как определено в таблице выше. |
static int | REF_invokeInterface | Вид ссылки прямого обработчика метода, как определено в таблице выше. |
static int | REF_invokeSpecial | Вид ссылки прямого обработчика метода, как определено в таблице выше. |
static int | REF_invokeStatic | Вид ссылки прямого обработчика метода, как определено в таблице выше. |
static int | REF_invokeVirtual | Вид ссылки прямого обработчика метода, как определено в таблице выше. |
static int | REF_newInvokeSpecial | Вид ссылки прямого обработчика метода, как определено в таблице выше. |
static int | REF_putField | Вид ссылки прямого обработчика метода, как определено в таблице выше. |
static int | REF_putStatic | Вид ссылки прямого обработчика метода, как определено в таблице выше. |
Методы
| Модификатор и тип | Метод | Описание |
|---|---|---|
Class<?> | getDeclaringClass() | Возвращает класс, в котором был определён основной член обработчика метода. |
MethodType | getMethodType() | Возвращает номинальный тип раскрытой символьной ссылки, представленный как тип метода. |
int | getModifiers() | Возвращает атрибуты доступа основного члена. |
String | getName() | Возвращает имя основного члена обработчика метода. |
int | getReferenceKind() | Возвращает вид ссылки обработчика метода, который определяет, был ли основной член конструктором, методом или полем. |
default boolean | isVarArgs() | Определяет, был ли основной член методом или конструктором с переменным числом аргументов. |
static String | referenceKindToString(int referenceKind) | Возвращает описательное имя данного вида ссылки, как определено в таблице выше. |
<T extends Member> | reflectAs(Class<T> expected,
MethodHandles.Lookup lookup) | Возвращает объект основного члена в виде метода, конструктора или поля. |
static String | toString(int kind,
Class<?> defc,
String name,
MethodType type) | Возвращает строковое представление |
Поля
REF_getField
static final int REF_getField
Ссылка на прямой обработчик метода, тип, как определено в таблице выше.
- См. также:
- Значения постоянных полей
REF_getStatic
static final int REF_getStatic
Ссылка на прямой обработчик метода, тип, как определено в таблице выше.
- См. также:
- Значения постоянных полей
REF_putField
static final int REF_putField
Ссылка на прямой обработчик метода, тип, как определено в таблице выше.
- См. также:
- Значения постоянных полей
REF_putStatic
static final int REF_putStatic
Ссылка на прямой обработчик метода, тип, как определено в таблице выше.
- См. также:
- Значения постоянных полей
REF_invokeVirtual
static final int REF_invokeVirtual
Ссылка на прямой обработчик метода, тип, как определено в таблице выше.
- См. также:
- Значения постоянных полей
REF_invokeStatic
static final int REF_invokeStatic
Ссылка на прямой обработчик метода, тип, как определено в таблице выше.
- См. также:
- Значения постоянных полей
REF_invokeSpecial
static final int REF_invokeSpecial
Ссылка на прямой обработчик метода, тип, как определено в таблице выше.
- См. также:
- Значения постоянных полей
REF_newInvokeSpecial
static final int REF_newInvokeSpecial
Ссылка на прямой обработчик метода, тип, как определено в таблице выше.
- См. также:
- Значения постоянных полей
REF_invokeInterface
static final int REF_invokeInterface
Ссылка на прямой обработчик метода, тип, как определено в таблице выше.
- См. также:
- Значения постоянных полей
Методы
getReferenceKind
int getReferenceKind()
Возвращает тип ссылки обработчика метода, который в свою очередь определяет, был ли член, лежащий в основе обработчика метода, конструктором, методом или полем. Определения см. в таблице выше.
- Возвращает:
- целочисленный код для типа ссылки, используемой для доступа к члену
getDeclaringClass
Class<?> getDeclaringClass()
Возвращает класс, в котором был определен член, лежащий в основе обработчика метода.
- Возвращает:
- декларирующий класс подлежащего члена
getName
String getName()
Возвращает имя члена, лежащего в основе обработчика метода. Это "<init>" если подлежащий член был конструктором, в противном случае это простое имя метода или имя поля.
- Возвращает:
- простое имя подлежащего члена
getMethodType
MethodType getMethodType()
Возвращает номинальный тип раскодированной символической ссылки, выраженной как тип метода. Если ссылка относится к конструктору, тип возврата будет void. Если это ссылка на нестатический метод, тип метода не будет упоминать this параметр. Если это ссылка на поле, и запрашиваемый доступ — чтение поля, тип метода не будет иметь параметров и вернет тип поля. Если это ссылка на поле, и запрашиваемый доступ — запись поля, тип метода будет иметь один параметр типа поля и вернет void.
Обратите внимание, что исходный прямой обработчик метода может включать ведущий this параметр, или (в случае конструктора) заменит void тип возврата на созданный класс. Номинальный тип не включает this параметр, и (в случае конструктора) вернёт void.
- Возвращает:
- тип подлежащего члена, выраженный как тип метода
reflectAs
<T extends Member> T reflectAs(Class<T> expected,
MethodHandles.Lookup lookup) Отображает подлежащий член как объект метода, конструктора или поля. Если подлежащий член является общедоступным, он отображается как если бы с помощью getMethod, getConstructor, или getField. В противном случае он отображается как если бы с помощью getDeclaredMethod, getDeclaredConstructor, или getDeclaredField. Подлежащий член должен быть доступен для данного объекта поиска.
- Параметры типов:
-
T- желаемый тип результата, либоMember, или подтип - Параметры:
-
expected- объект класса, представляющий желаемый тип результатаT -
lookup- объект поиска, который создал этот MethodHandleInfo, или такой же с эквивалентными привилегиями доступа - Возвращает:
- ссылка на объект метода, конструктора или поля
- Исключения:
-
ClassCastException- если член не является ожидаемого типа -
NullPointerException- если любой из аргументовnull -
IllegalArgumentException- если подлежащий член недоступен для данного объекта поиска
getModifiers
int getModifiers()
Возвращает модификаторы доступа подлежащего члена.
- Возвращает:
- модификаторы языка Java для подлежащего члена, или -1, если член недоступен
- См. также:
-
Modifier,reflectAs(java.lang.Class<T>, java.lang.invoke.MethodHandles.Lookup)
isVarArgs
default boolean isVarArgs()
Определяет, был ли подлежащий член методом или конструктором с переменным числом аргументов. Такие члены представлены обработчиками методов, которые являются коллекторами varargs.
- Требования к реализации:
- Это производит результат, эквивалентный:
getReferenceKind() >= REF_invokeVirtual && Modifier.isTransient(getModifiers())
- Возвращает:
-
trueтогда и только тогда, когда подлежащий член был объявлен с переменным числом аргументов.
referenceKindToString
static String referenceKindToString(int referenceKind)
Возвращает описательное имя данного типа ссылки, как определено в таблице выше. Префикс "REF_" опущен.
- Параметры:
-
referenceKind- целочисленный код для типа ссылки, используемой для доступа к члену класса - Возвращает:
- строка в смешанном регистре, например
"getField" - Исключения:
-
IllegalArgumentException- если аргумент не является допустимым номером типа ссылки
toString
static String toString(int kind,
Class<?> defc,
String name,
MethodType type) Возвращает строковое представление для MethodHandleInfo, используя четыре части его символической ссылки. Это определяется как "RK C.N:MT", где RK — строка типа ссылки для kind, C — имя defc N, name, и MT — type. Эти четыре значения можно получить из типа ссылки, декларирующего класса, имени члена и типа метода объекта MethodHandleInfo.
- Требования к реализации:
- Это производит результат, эквивалентный:
String.format("%s %s.%s:%s", referenceKindToString(kind), defc.getName(), name, type) - Параметры:
-
kind- часть типа ссылки символической ссылки -
defc- часть декларирующего класса символической ссылки -
name- часть имени члена символической ссылки -
type- часть типа метода символической ссылки - Возвращает:
- строка вида
"RK C.N:MT" - Исключения:
-
IllegalArgumentException- если первый аргумент не является допустимым номером типа ссылки -
NullPointerException- если какой-либо аргумент ссылкиnull
© 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/MethodHandleInfo.html