Интерфейс MethodHandleInfo
public interface MethodHandleInfo
Lookup.revealDirect. Прямые обработчики методов
Прямой обработчик метода представляет метод, конструктор или поле без каких-либо промежуточных связываний аргументов или других преобразований. Метод, конструктор или поле, на которые ссылается прямой обработчик метода, называется его основным членом. Прямые обработчики методов могут быть получены следующими способами:- Выполнив инструкцию
ldcнад константойCONSTANT_MethodHandle. (См. спецификацию виртуальной машины Java, разделы 4.4.8 и 5.4.3.) - Вызвав один из методов-фабрик Lookup, например,
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) для отмены этого ограничения.
Виды ссылок
Методы-фабрики 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 final int |
REF_getField |
Вид ссылки прямого обработчика метода, как определено в таблице выше. |
static final int |
REF_getStatic |
Вид ссылки прямого обработчика метода, как определено в таблице выше. |
static final int |
REF_invokeInterface |
Вид ссылки прямого обработчика метода, как определено в таблице выше. |
static final int |
REF_invokeSpecial |
Вид ссылки прямого обработчика метода, как определено в таблице выше. |
static final int |
REF_invokeStatic |
Вид ссылки прямого обработчика метода, как определено в таблице выше. |
static final int |
REF_invokeVirtual |
Вид ссылки прямого обработчика метода, как определено в таблице выше. |
static final int |
REF_newInvokeSpecial |
Вид ссылки прямого обработчика метода, как определено в таблице выше. |
static final int |
REF_putField |
Вид ссылки прямого обработчика метода, как определено в таблице выше. |
static final int |
REF_putStatic |
Вид ссылки прямого обработчика метода, как определено в таблице выше. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
Class |
getDeclaringClass() |
Возвращает класс, в котором был определен основной член обработанного обработчика метода. |
MethodType |
getMethodType() |
Возвращает номинальный тип разорванной символьной ссылки, представленный как тип метода. |
int |
getModifiers() |
Возвращает модификаторы доступа основного члена. |
String |
getName() |
Возвращает имя основного члена обработанного обработчика метода. |
int |
getReferenceKind() |
Возвращает вид ссылки обработанного обработчика метода, который определяет, был ли основной член обработчика метода конструктором, методом или полем. |
default boolean |
isVarArgs() |
Определяет, был ли основной член методом или конструктором с переменным числом аргументов. |
static String |
referenceKindToString |
Возвращает описательное имя данного вида ссылки, как определено в таблице выше. |
<T extends Member> |
reflectAs |
Отображает основной член как объект метода, конструктора или поля. |
static String |
toString |
Возвращает строковое представление MethodHandleInfo, заданное четырьмя частями его символьной ссылки. |
Подробное описание полей
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()
- Возвращает:
- простое имя базового члена
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, если к члену нельзя получить доступ
- См. также:
isVarArgs
default boolean isVarArgs()
- Требования к реализации:
- Это даёт результат, эквивалентный:
getReferenceKind() >= REF_invokeVirtual && Modifier.isTransient(getModifiers()) - Возвращает:
-
trueесли и только если базовый член был объявлен с переменным числом аргументов.
referenceKindToString
static String referenceKindToString(int referenceKind)
- Параметры:
-
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, 2025, 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://download.java.net/java/early_access/jdk24/docs/api/java.base/java/lang/invoke/MethodHandleInfo.html