Интерфейс 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 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>
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, 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.
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/invoke/MethodHandleInfo.html

Spec-Zone .ru
спецификации, руководства, описания, API