Spec-Zone.ru › OpenJDK 24

Интерфейс MethodHandleInfo

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

Прямые обработчики методов

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

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

© 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://download.java.net/java/early_access/jdk24/docs/api/java.base/java/lang/invoke/MethodHandleInfo.html

Spec-Zone.ru

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