Spec-Zone.ru › OpenJDK 17

Интерфейс 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 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

"<init>"
Возвращает имя базового члена расколотого обработчика метода. Это "<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, 2021, 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/17/docs/api/java.base/java/lang/invoke/MethodHandleInfo.html

Spec-Zone.ru

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