Spec-Zone.ru › OpenJDK 8

Интерфейс MethodHandleInfo


public interface MethodHandleInfo

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

Прямые ссылки на методы

Прямая ссылка на метод представляет метод, конструктор или поле без промежуточных привязок аргументов или других преобразований. Метод, конструктор или поле, на которые ссылается прямая ссылка на метод, называется основным членом. Прямые ссылки на методы могут быть получены любым из следующих способов:
  • Выполняя инструкцию ldc над константой CONSTANT_MethodHandle. (См. Спецификацию Java Virtual Machine, разделы 4.4.8 и 5.4.3.)
  • Вызвав один из методов фабрики методов поиска, таких как 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) для отмены этого ограничения.

Типы ссылок

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

Spec-Zone.ru

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