Интерфейс MethodHandleInfo
public interface MethodHandleInfo
Символьная ссылка, полученная путем разбора прямой ссылки на метод на составляющие символьные части. Для разбора прямой ссылки на метод вызовите Lookup.revealDirect.
Прямые ссылки на методы
Прямая ссылка на метод представляет метод, конструктор или поле без промежуточных привязок аргументов или других преобразований. Метод, конструктор или поле, на которые ссылается прямая ссылка на метод, называется основным членом. Прямые ссылки на методы могут быть получены любым из следующих способов:- Выполняя инструкцию
ldcнад константойCONSTANT_MethodHandle. (См. Спецификацию Java Virtual Machine, разделы 4.4.8 и 5.4.3.) - Вызвав один из методов фабрики методов поиска, таких как
Lookup.findVirtual, для разрешения символической ссылки в ссылку на метод. Символическая ссылка состоит из класса, имени строки и типа. - Вызвав метод фабрики
Lookup.unreflectилиLookup.unreflectSpecialдля преобразованияMethodв ссылку на метод. - Вызвав метод фабрики
Lookup.unreflectConstructorдля преобразованияConstructorв ссылку на метод. - Вызвав метод фабрики
Lookup.unreflectGetterилиLookup.unreflectSetterдля преобразованияFieldв ссылку на метод.
Ограничения при разборе
Учитывая подходящий объектLookup, можно разобрать любую прямую ссылку на метод для восстановления символической ссылки на основной метод, конструктор или поле. Разбор необходимо выполнять с помощью объекта Lookup, эквивалентного объекту, который создал целевую ссылку на метод, или с достаточными правами доступа для создания эквивалентной ссылки на метод.
Если основной метод чувствителен к вызывающему объекту, прямая ссылка на метод будет «привязана» к определенному классу вызывающего объекта, классу поиска lookup class объекта поиска, используемого для его создания. Разбор этой ссылки на метод с другим классом поиска завершится неудачей, даже если основной метод является общедоступным (например, Class.forName).
Требование соответствия объекта поиска обеспечивает «быстрый отказ» для программ, которые могут иначе доверять ошибочному раскрытию ссылки на метод с символической информацией (или привязкой вызывающего объекта) из неожиданной области видимости. Используйте MethodHandles.reflectAs(java.lang.Class<T>, java.lang.invoke.MethodHandle) для отмены этого ограничения.
Типы ссылок
Методы фабрики методов поиска соответствуют всем основным случаям использования методов, конструкторов и полей. Эти случаи могут быть различимы с помощью небольших целых чисел следующим образом:| вид ссылки | описательное имя | область видимости | член | поведение |
|---|---|---|---|---|
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.