Класс MethodType
- Все реализованные интерфейсы:
-
Serializable,Constable,TypeDescriptor,TypeDescriptor.OfMethod<Class<?>, MethodType>
public final class MethodType extends Object implements Constable, TypeDescriptor.OfMethod<Class<?>, MethodType>, Serializable
MethodHandle.invokeExact и MethodHandle.invoke, а также во время выполнения invokedynamic инструкций. Структура представляет собой тип возвращаемого значения, сопровождаемый любым количеством типов параметров. Типы (примитивные, void и ссылочные) представлены объектами Class. (Для простоты изложения мы рассматриваем void как тип. На самом деле это обозначает отсутствие типа возвращаемого значения.)
Все экземпляры MethodType являются неизменяемыми. Два экземпляра полностью взаимозаменяемы, если они равны. Равенство зависит от попарного соответствия типов возвращаемого значения и параметров и ни от чего больше.
Этот тип может быть создан только методами-фабриками. Все методы-фабрики могут кэшировать значения, хотя кэширование не гарантируется. Некоторые методы-фабрики являются статическими, в то время как другие являются виртуальными методами, которые изменяют предшествующие типы методов, например, путем изменения выбранного параметра.
Методы-фабрики, которые работают с группами типов параметров, систематически представляются в двух версиях, так что можно использовать как массивы Java, так и списки Java для работы с группами типов параметров. Методы запроса parameterArray и parameterList также предоставляют выбор между массивами и списками.
MethodType объекты иногда выводятся из инструкций байткода, таких как invokedynamic, в частности, из строк описателей типов, связанных с инструкциями в пуле констант файла класса.
Как классы и строки, типы методов также могут быть представлены непосредственно в пуле констант файла класса как константы. Тип метода может быть загружен инструкцией ldc, которая ссылается на соответствующую запись пула констант CONSTANT_MethodType. Запись ссылается на CONSTANT_Utf8 написание для строки-описателя. (Подробные сведения о константах типов методов см. в разделах 4.4.8 и 5.4.3.5 спецификации Java Virtual Machine.)
Когда JVM материализует MethodType из строки-описателя, все классы, указанные в описателе, должны быть доступны и будут загружены. (Но классы не обязательно должны быть инициализированы, как в случае с CONSTANT_Class.) Эта загрузка может произойти в любое время до того, как объект MethodType будет впервые получен.
MethodType может быть описан в именной форме, если и только если все типы параметров и тип возвращаемого значения могут быть описаны с помощью nominal descriptor, представленного ClassDesc. Если тип метода может быть описан в именной форме, то:
- Тип метода имеет
nominal descriptor, возвращаемыйMethodType::describeConstable. - Строка-описатель, возвращаемая
MethodType::descriptorStringилиMethodType::toMethodDescriptorStringдля типа метода, является описателем метода (JVMS 4.3.3).
Если любой из типов параметров или тип возвращаемого значения не может быть описан в именной форме, т.е. Class::describeConstable возвращает пустой необязательный элемент для этого типа, то тип метода не может быть описан в именной форме:
- Тип метода не имеет
nominal descriptor, иMethodType::describeConstableвозвращает пустой необязательный элемент. - Строка-описатель, возвращаемая
MethodType::descriptorStringилиMethodType::toMethodDescriptorStringдля типа метода, не является описателем типа.
- С:
- 1.7
- См. также:
Краткое описание вложенных классов
Вложенные классы/интерфейсы, объявленные в интерфейсе java.lang.invoke.TypeDescriptor
TypeDescriptor.OfField<F extends TypeDescriptor.OfField<F>>, TypeDescriptor.OfMethod<F extends TypeDescriptor.OfField<F>, M extends TypeDescriptor.OfMethod<F, M>>
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
MethodType |
appendParameterTypes |
Находит или создаёт тип метода с дополнительными типами параметров. |
MethodType |
appendParameterTypes |
Находит или создаёт тип метода с дополнительными типами параметров. |
MethodType |
changeParameterType |
Находит или создаёт тип метода с единственным отличным типом параметра. |
MethodType |
changeReturnType |
Находит или создаёт тип метода с другим типом возвращаемого значения. |
Optional |
describeConstable() |
Возвращает номинальный дескриптор для этого экземпляра, если его можно построить, или пустой Optional, если его нельзя. |
String |
descriptorString() |
Возвращает строку-дескриптор для этого типа метода. |
MethodType |
dropParameterTypes |
Находит или создаёт тип метода с некоторыми опущенными типами параметров. |
boolean |
equals |
Сравнивает указанный объект с этим типом для равенства. |
MethodType |
erase() |
Удаляет все типы ссылок на Object. |
static MethodType |
fromMethodDescriptorString |
Находит или создаёт экземпляр типа метода заданного дескриптора метода (JVMS 4.3.3). |
MethodType |
generic() |
Преобразует все типы, как ссылки, так и примитивные, в Object. |
static MethodType |
genericMethodType |
Находит или создаёт тип метода, компоненты которого все Object. |
static MethodType |
genericMethodType |
Находит или создаёт тип метода, компоненты которого Object с необязательным заключительным Object[] массивом. |
int |
hashCode() |
Возвращает значение хэш-кода для этого типа метода. |
boolean |
hasPrimitives() |
Сообщает, содержит ли этот тип примитивный аргумент или возвращаемое значение. |
boolean |
hasWrappers() |
Сообщает, содержит ли этот тип обёрнутый аргумент или возвращаемое значение. |
MethodType |
insertParameterTypes |
Находит или создаёт тип метода с дополнительными типами параметров. |
MethodType |
insertParameterTypes |
Находит или создаёт тип метода с дополнительными типами параметров. |
Class |
lastParameterType() |
Возвращает последний тип параметра этого типа метода. |
static MethodType |
methodType |
Находит или создаёт тип метода с заданными компонентами. |
static MethodType |
methodType |
Находит или создаёт тип метода с заданными компонентами. |
static MethodType |
methodType |
Находит или создаёт экземпляр заданного типа метода. |
static MethodType |
methodType |
Находит или создаёт тип метода с заданными компонентами. |
static MethodType |
methodType |
Находит или создаёт тип метода с заданными компонентами. |
static MethodType |
methodType |
Находит или создаёт тип метода с заданными компонентами. |
Class<?>[] |
parameterArray() |
Представляет типы параметров как массив (метод для удобства). |
int |
parameterCount() |
Возвращает количество типов параметров в этом типе метода. |
List |
parameterList() |
Представляет типы параметров как список (метод для удобства). |
Class |
parameterType |
Возвращает тип параметра по указанному индексу в этом типе метода. |
Class |
returnType() |
Возвращает тип возвращаемого значения этого типа метода. |
String |
toMethodDescriptorString() |
Возвращает строку-дескриптор для этого типа метода. |
String |
toString() |
Возвращает строковое представление типа метода в формате "(PT0,PT1...)RT". |
MethodType |
unwrap() |
Преобразует все обернутые типы в соответствующие примитивные типы. |
MethodType |
wrap() |
Преобразует все примитивные типы в соответствующие обернутые типы. |
Подробное описание методов
methodType
public static MethodType methodType(Class<?> rtype, Class<?>[] ptypes)
- Параметры:
-
rtype- тип возвращаемого значения -
ptypes- типы параметров - Возвращает:
- тип метода с заданными компонентами
- Исключения:
-
NullPointerException- еслиrtypeилиptypesили любой элементptypesравен null -
IllegalArgumentException- если любой элементptypesравенvoid.class
methodType
public static MethodType methodType(Class<?> rtype, List<Class<?>> ptypes)
methodType.- Параметры:
-
rtype- тип возвращаемого значения -
ptypes- типы параметров - Возвращает:
- тип метода с заданными компонентами
- Исключения:
-
NullPointerException- еслиrtypeилиptypesили любой элементptypesравен null -
IllegalArgumentException- если любой элементptypesравенvoid.class
methodType
public static MethodType methodType(Class<?> rtype, Class<?> ptype0, Class<?>... ptypes)
methodType. Тип первого параметра добавляется в начало оставшегося массива.- Параметры:
-
rtype- тип возвращаемого значения -
ptype0- тип первого параметра -
ptypes- оставшиеся типы параметров - Возвращает:
- тип метода с заданными компонентами
- Исключения:
-
NullPointerException- еслиrtypeилиptype0илиptypesили любой элементptypesравен null -
IllegalArgumentException- еслиptype0илиptypesили любой элементptypesравенvoid.class
methodType
public static MethodType methodType(Class<?> rtype)
methodType. Результирующий метод не имеет типов параметров.- Параметры:
-
rtype- тип возвращаемого значения - Возвращает:
- тип метода с заданным возвращаемым значением
- Исключения:
-
NullPointerException- еслиrtypeравен null
methodType
public static MethodType methodType(Class<?> rtype, Class<?> ptype0)
methodType. Результирующий метод имеет единственный заданный тип параметра.- Параметры:
-
rtype- тип возвращаемого значения -
ptype0- тип параметра - Возвращает:
- тип метода с заданным возвращаемым значением и типом параметра
- Исключения:
-
NullPointerException- еслиrtypeилиptype0равны null -
IllegalArgumentException- еслиptype0равенvoid.class
methodType
public static MethodType methodType(Class<?> rtype, MethodType ptypes)
methodType. Результирующий метод имеет те же типы параметров, что и ptypes, и указанный тип возвращаемого значения.- Параметры:
-
rtype- тип возвращаемого значения -
ptypes- тип метода, предоставляющий типы параметров - Возвращает:
- тип метода с заданными компонентами
- Исключения:
-
NullPointerException- еслиrtypeилиptypesравны null
genericMethodType
public static MethodType genericMethodType(int objectArgCount, boolean finalArray)
Object с необязательным заключительным массивом Object[]. Удобный метод для methodType. Все параметры и возвращаемый тип будут Object, за исключением конечного массива параметров, если он есть, который будет Object[].- Параметры:
-
objectArgCount- количество параметров (исключая конечный массив параметров, если он есть) -
finalArray- наличие конечного массива параметров, типаObject[] - Возвращает:
- универсальный тип метода, для всех вызовов с заданным фиксированным числом аргументов и собранным массивом дополнительных аргументов
- Исключения:
-
IllegalArgumentException- еслиobjectArgCountотрицательно или больше 255 (или 254, еслиfinalArrayистинно) - См. также:
genericMethodType
public static MethodType genericMethodType(int objectArgCount)
Object. Удобный метод для methodType. Все параметры и возвращаемый тип будут Object.- Параметры:
-
objectArgCount- количество параметров - Возвращает:
- универсальный тип метода, для всех вызовов с заданным числом аргументов
- Исключения:
-
IllegalArgumentException- еслиobjectArgCountотрицательно или больше 255 - См. также:
changeParameterType
public MethodType changeParameterType(int num, Class<?> nptype)
methodType.- Определено в:
-
changeParameterTypeв интерфейсеTypeDescriptor.OfMethod<Class<?>, MethodType> - Параметры:
-
num- индекс (от нуля) изменяемого типа параметра -
nptype- новый тип параметра, который заменяет старый - Возвращает:
- тот же тип, за исключением изменённого параметра
- Исключения:
-
IndexOutOfBoundsException- еслиnumне является допустимым индексом дляparameterArray() -
IllegalArgumentException- еслиnptypeравенvoid.class -
NullPointerException- еслиnptypeравен null
insertParameterTypes
public MethodType insertParameterTypes(int num, Class<?>... ptypesToInsert)
methodType.- Определено в:
-
insertParameterTypesв интерфейсеTypeDescriptor.OfMethod<Class<?>, MethodType> - Параметры:
-
num- позиция (от нуля) вставляемого типа(ов) параметра -
ptypesToInsert- ноль или более новых типов параметров для вставки в список параметров - Возвращает:
- тот же тип, за исключением вставленных параметров
- Исключения:
-
IndexOutOfBoundsException- еслиnumотрицательно или большеparameterCount() -
IllegalArgumentException- если любой элементptypesToInsertравенvoid.classили если результирующий тип метода будет иметь более 255 слотов параметров -
NullPointerException- еслиptypesToInsertили любой из его элементов равен null
appendParameterTypes
public MethodType appendParameterTypes(Class<?>... ptypesToInsert)
methodType.- Параметры:
-
ptypesToInsert- ноль или более новых типов параметров для вставки после конца списка параметров - Возвращает:
- тот же тип, за исключением добавленных параметров
- Исключения:
-
IllegalArgumentException- если любой элементptypesToInsertравенvoid.classили если результирующий тип метода будет иметь более 255 слотов параметров -
NullPointerException- еслиptypesToInsertили любой из его элементов равен null
insertParameterTypes
public MethodType insertParameterTypes(int num, List<Class<?>> ptypesToInsert)
methodType.- Parameters:
-
num— позиция (с нуля) вставляемого типа параметра(ов) -
ptypesToInsert— ноль или более новых типов параметров для вставки в список параметров - Returns:
- тот же тип, за исключением вставленных параметров
- Throws:
-
IndexOutOfBoundsException— еслиnumотрицательно или больше чемparameterCount() -
IllegalArgumentException— если любой элементptypesToInsertявляетсяvoid.classили если результирующий тип метода будет иметь более 255 слотов параметров -
NullPointerException— еслиptypesToInsertили любой из его элементов равен null
appendParameterTypes
public MethodType appendParameterTypes(List<Class<?>> ptypesToInsert)
methodType.- Parameters:
-
ptypesToInsert— ноль или более новых типов параметров для вставки после конца списка параметров - Returns:
- тот же тип, за исключением добавленных параметров
- Throws:
-
IllegalArgumentException— если любой элементptypesToInsertравенvoid.classили если результирующий тип метода будет иметь более 255 слотов параметров -
NullPointerException— еслиptypesToInsertили любой из его элементов равен null
dropParameterTypes
public MethodType dropParameterTypes(int start, int end)
methodType.- Specified by:
-
dropParameterTypesв интерфейсеTypeDescriptor.OfMethod<Class<?>, MethodType> - Parameters:
-
start— индекс (с нуля) первого удаляемого типа параметра -
end— индекс (больше чемstart) первого типа параметра после которого не удалять - Returns:
- тот же тип, за исключением удалённых параметров
- Throws:
-
IndexOutOfBoundsException— еслиstartотрицательно или больше чемparameterCount()или еслиendотрицательно или больше чемparameterCount()или еслиstartбольше чемend
changeReturnType
public MethodType changeReturnType(Class<?> nrtype)
methodType.- Specified by:
-
changeReturnTypeв интерфейсеTypeDescriptor.OfMethod<Class<?>, MethodType> - Parameters:
-
nrtype— тип возврата, которым нужно заменить старый - Returns:
- тот же тип, за исключением изменения типа возврата
- Throws:
-
NullPointerException— еслиnrtypeравен null
hasPrimitives
public boolean hasPrimitives()
void считается примитивным.- Returns:
- true, если любой из типов — примитивный
hasWrappers
public boolean hasWrappers()
Integer. Ссылочный тип java.lang.Void считается оберткой, если он встречается в качестве типа возврата.- Returns:
- true, если любой из типов — обёртка
erase
public MethodType erase()
Object. Удобный метод для methodType. Все примитивные типы (включая void) останутся без изменений.- Returns:
- версия исходного типа со всеми ссылочными типами, заменёнными
generic
public MethodType generic()
Object. Удобный метод для genericMethodType. Выражение type.wrap().erase() даёт такой же результат, как type.generic().- Returns:
- версия исходного типа со всеми типами, заменёнными
wrap
public MethodType wrap()
methodType. Все ссылочные типы (включая обёрнутые типы) останутся без изменений. Тип возврата void изменяется на тип java.lang.Void. Выражение type.wrap().erase() даёт такой же результат, как type.generic().- Returns:
- версия исходного типа со всеми примитивными типами, заменёнными
unwrap
public MethodType unwrap()
methodType. Все примитивные типы (включая void) останутся без изменений. Тип возврата java.lang.Void изменяется на void.- Returns:
- версия исходного типа со всеми обёрнутыми типами, заменёнными
parameterType
public Class<?> parameterType(int num)
- Specified by:
-
parameterTypeв интерфейсеTypeDescriptor.OfMethod<Class<?>, MethodType> - Parameters:
-
num— индекс (с нуля) требуемого типа параметра - Returns:
- выбранный тип параметра
- Throws:
-
IndexOutOfBoundsException— еслиnumне является допустимым индексом вparameterArray()
parameterCount
public int parameterCount()
- Specified by:
-
parameterCountв интерфейсеTypeDescriptor.OfMethod<Class<?>, MethodType> - Returns:
- количество типов параметров
returnType
public Class<?> returnType()
- Specified by:
-
returnTypeв интерфейсеTypeDescriptor.OfMethod<Class<?>, MethodType> - Returns:
- тип возвращаемого значения
parameterList
public List<Class<?>> parameterList()
- Specified by:
-
parameterListв интерфейсеTypeDescriptor.OfMethod<Class<?>, MethodType> - Returns:
- типы параметров (как неизменяемый список)
lastParameterType
public Class<?> lastParameterType()
void.class.- API Note:
Значение-заполнитель выбрано так, чтобы рефлексивные запросы могли быть выполнены непосредственно к результату. Значение-заполнитель не может быть перепутано с реальным параметром, поскольку
voidникогда не является типом параметра. Для режимов вызова с переменным числом аргументов полезно выражениеlastParameterType().getComponentType()для запроса типа параметра «переменное число аргументов».- Returns:
- последний тип параметра, если он есть, иначе
void.class - Since:
- 10
parameterArray
public Class<?>[] parameterArray()
- Specified by:
-
parameterArrayв интерфейсеTypeDescriptor.OfMethod<Class<?>, MethodType> - Returns:
- типы параметров (как новая копия, если необходимо)
equals
public boolean equals(Object x)
true тогда и только тогда, когда указанный объект также является типом метода с ровно теми же параметрами и типом возврата.hashCode
public int hashCode()
toString
public String toString()
"(PT0,PT1...)RT". Строковое представление типа метода — это заключенный в скобки, разделенный запятыми список имён типов, сразу за которым следует тип возвращаемого значения. Каждый тип представлен с помощью его simple name.
fromMethodDescriptorString
public static MethodType fromMethodDescriptorString(String descriptor, ClassLoader loader) throws IllegalArgumentException, TypeNotPresentException
methodType. Любое имя класса или интерфейса, встроенное в строку описателя, будет разрешено заданным загрузчиком (или, если это null, системным загрузчиком классов).- API Note:
- Возможны типы методов, имеющие допустимые описатели, но не могут быть построены этим методом, поскольку их составные типы не видны из общего загрузчика классов.
Этот метод включён для удобства приложений, которым необходимо генерировать байткоды, обрабатывающие дескрипторы методов и
invokedynamic. - Параметры:
-
descriptor— строка описателя метода -
loader— загрузчик классов для поиска типов - Возвращает:
- тип метода по заданному описателю
- Исключения:
-
NullPointerException— если строка имеетnullформат -
IllegalArgumentException— если строка не является описателем метода -
TypeNotPresentException— если имя типа не найдено - См. Спецификацию виртуальной машины Java:
- 4.3.3 Описатели методов
toMethodDescriptorString
public String toMethodDescriptorString()
MethodType::descriptorString.- API Note:
- Это не строго обратное преобразование
fromMethodDescriptorString, которое требует описатель типа метода (JVMS 4.3.3) и аргумент загрузчика классов. Два различныхMethodTypeобъекта могут иметь идентичную строку описателя, так как разные классы могут иметь одинаковое имя, но разные загрузчики классов.Этот метод включён для удобства приложений, которым необходимо генерировать байткоды, обрабатывающие дескрипторы методов и
invokedynamic. - Возвращает:
- строку описателя для этого типа метода
- См. Спецификацию виртуальной машины Java:
- 4.3.3 Описатели методов
- См. также:
descriptorString
public String descriptorString()
Если для этого типа метода можно создать номинальное описание, то результатом будет описатель типа метода (JVMS 4.3.3). MethodTypeDesc для этого типа метода можно получить, вызвав MethodTypeDesc::ofDescriptor со строкой результирующего описателя.
Если для этого типа метода нельзя создать номинальное описание, и результатом является строка вида:
"(<parameter-descriptors>)<return-descriptor>" где <parameter-descriptors> — конкатенация строки описателя описателя всех типов параметров и строки описателя описателя типа возвращаемого значения. Из результирующей строки нельзя создать MethodTypeDesc.- Specified by:
-
descriptorStringв интерфейсеTypeDescriptor - Возвращает:
- строку описателя для этого типа метода
- См. Спецификацию виртуальной машины Java:
- 4.3.3 Описатели методов
- Since:
- 12
- См. также:
describeConstable
public Optional<MethodTypeDesc> describeConstable()
Optional, если нет.- Specified by:
-
describeConstableв интерфейсеConstable - Возвращает:
- объект
Optional, содержащий результирующее номинальное описание, или пустойOptional, если оно не может быть создано. - Since:
- 12
- См. также:
© 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/MethodType.html