Spec-Zone.ru › OpenJDK 21

Интерфейс 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, эквивалентного тому, который создал целевой обработчик метода, или имеющего достаточные разрешения для создания эквивалентного обработчика метода.

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

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

Виды ссылок

Методы-фабрики Lookup соответствуют всем основным случаям использования методов, конструкторов и полей. Эти случаи могут быть выделены с помощью небольших целых чисел следующим образом:
reference kinds
вид ссылки описательное имя область член поведение
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(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, 2023, 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/21/docs/api/java.base/java/lang/invoke/MethodHandleInfo.html

Spec-Zone.ru

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