Spec-Zone.ru › OpenJDK 25

Интерфейс MethodHandleInfo

public interface MethodHandleInfo
Символьная ссылка, полученная путем разложения прямого дескриптора метода на составляющие его символьные части. Чтобы разложить прямой дескриптор метода, вызовите Lookup.revealDirect.

Прямые дескрипторы методов

Прямой дескриптор метода представляет метод, конструктор или поле без каких-либо промежуточных привязок аргументов или других преобразований. Метод, конструктор или поле, на которое ссылается прямой дескриптор метода, называется его базовым членом. Прямые дескрипторы методов можно получить следующими способами:
  • Выполнив инструкцию ldc для константы CONSTANT_MethodHandle. (См. разделы 4.4.8 и 5.4.3 Спецификации виртуальной машины Java.)
  • Вызвав один из фабричных методов Lookup, например Lookup.findVirtual, чтобы разрешить символьную ссылку в дескриптор метода. Символьная ссылка состоит из класса, строки с именем и типа.
  • Вызвав фабричный метод Lookup.unreflect или Lookup.unreflectSpecial, чтобы преобразовать Method в дескриптор метода.
  • Вызвав фабричный метод Lookup.unreflectConstructor, чтобы преобразовать Constructor в дескриптор метода.
  • Вызвав фабричный метод Lookup.unreflectGetter или Lookup.unreflectSetter, чтобы преобразовать Field в дескриптор метода.

Ограничения на разложение

При наличии подходящего объекта Lookup можно разложить любой прямой дескриптор метода и восстановить символьную ссылку на базовый метод, конструктор или поле. Разложение необходимо выполнять с помощью объекта Lookup, эквивалентного объекту, создавшему целевой дескриптор метода, либо обладающего достаточными правами доступа для создания эквивалентного дескриптора метода.

Если базовый метод чувствителен к вызывающему коду (caller sensitive), прямой дескриптор метода будет «привязан» к определенному классу вызывающего кода — классу поиска объекта поиска, использованного для его создания. Попытка разложить этот дескриптор метода с другим классом поиска завершится неудачей, даже если базовый метод является открытым (как Class.forName).

Требование соответствия объекта поиска обеспечивает «быстрый отказ» для программ, которые в противном случае могли бы довериться ошибочному раскрытию дескриптора метода с символьной информацией (или привязкой к вызывающему коду) из неожиданной области видимости. Чтобы обойти это ограничение, используйте MethodHandles.reflectAs(Class, MethodHandle).

Виды ссылок

Фабричные методы Lookup охватывают все основные случаи использования методов, конструкторов и полей. Эти случаи использования можно различать с помощью небольших целых чисел следующим образом:
виды ссылок
вид ссылки описательное имя область видимости член поведение
1 REF_getField class FT f; (T) this.f;
2 REF_getStatic class или interface static
FT f;
(T) C.f;
3 REF_putField class FT f; this.f = x;
4 REF_putStatic class static
FT f;
C.f = arg;
5 REF_invokeVirtual class T m(A*); (T) this.m(arg*);
6 REF_invokeStatic class или interface static
T 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(int referenceKind)
Возвращает описательное имя указанного вида ссылки, определенное в таблице выше.
<T extends Member>
T
reflectAs(Class<T> expected, MethodHandles.Lookup lookup)
Представляет базовый член в виде объекта метода, конструктора или поля.
static String toString(int kind, Class<?> defc, String name, MethodType type)
Возвращает строковое представление для 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()
Возвращает имя базового члена разложенного дескриптора метода. Это "<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(Class, 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

Сообщить об ошибке или предложить улучшение
Дополнительные справочные материалы по API и документацию для разработчиков см. в разделе Документация Java SE, содержащем более подробные описания для разработчиков, включая обзоры концепций, определения терминов, обходные решения и примеры работающего кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или ее аффилированных лиц в США и других странах.
Авторское право © 1993, 2025, Oracle и/или ее аффилированные лица, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
Все права защищены. Использование регулируется условиями лицензии и политикой распространения документации.

© 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://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/invoke/MethodHandleInfo.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API