Класс 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.)
Когда JVM материализует MethodType из строки дескриптора, все классы, указанные в дескрипторе, должны быть доступны и будут загружены. (Однако классы не обязательно должны быть инициализированы, как в случае с CONSTANT_Class.) Эта загрузка может произойти в любой момент до того, как объект MethodType будет впервые получен.
MethodType можно описать в номинальной форме тогда и только тогда, когда все типы параметров и возвращаемый тип можно описать с помощью nominal descriptor, представленного объектом ClassDesc. Если тип метода можно описать номинально, то:
- Тип метода имеет
nominal descriptor, возвращаемый методомMethodType::describeConstable. - Строка дескриптора, возвращаемая методом
MethodType::descriptorStringилиMethodType::toMethodDescriptorStringдля этого типа метода, является дескриптором метода (JVMS 4.3.3).
Если какой-либо тип параметра или возвращаемый тип нельзя описать номинально, то есть Class::describeConstable возвращает пустой объект Optional для этого типа, номинальное описание типа метода невозможно:
- У типа метода нет
nominal descriptor, аMethodType::describeConstableвозвращает пустой объект Optional. - Строка дескриптора, возвращаемая методом
MethodType::descriptorStringилиMethodType::toMethodDescriptorStringдля этого типа метода, не является дескриптором типа.
- Начиная с версии:
- 1.7
- См. также:
Краткое описание вложенных классов
Вложенные классы/интерфейсы, объявленные в интерфейсе TypeDescriptor
TypeDescriptor.OfField<F>, 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равно true) - См. также:
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.- Параметры:
-
num— позиция (начиная с нуля), в которую вставляются типы параметров -
ptypesToInsert— ноль или более новых типов параметров для вставки в список параметров - Возвращает:
- тот же тип, но с вставленными выбранными параметрами
- Вызывает исключение:
-
IndexOutOfBoundsException— еслиnumотрицательно или большеparameterCount() -
IllegalArgumentException— если любой элементptypesToInsertявляетсяvoid.classили если в результирующем типе метода будет более 255 слотов параметров -
NullPointerException— еслиptypesToInsertили любой его элемент равен null
appendParameterTypes
public MethodType appendParameterTypes(List<Class<?>> ptypesToInsert)
methodType.- Параметры:
-
ptypesToInsert— ноль или более новых типов параметров для добавления в конец списка параметров - Возвращает:
- тот же тип, но с добавленными выбранными параметрами
- Вызывает исключение:
-
IllegalArgumentException— если любой элементptypesToInsertявляетсяvoid.classили если в результирующем типе метода будет более 255 слотов параметров -
NullPointerException— еслиptypesToInsertили любой его элемент равен null
dropParameterTypes
public MethodType dropParameterTypes(int start, int end)
methodType.- Определено в:
-
dropParameterTypesв интерфейсеTypeDescriptor.OfMethod<Class<?>, MethodType> - Параметры:
-
start— индекс (начиная с нуля) первого удаляемого типа параметра -
end— индекс (большеstart) первого типа параметра, следующего за диапазоном удаляемых - Возвращает:
- тот же тип, но с удаленными выбранными параметрами
- Вызывает исключение:
-
IndexOutOfBoundsException— еслиstartотрицательно или большеparameterCount(), либо еслиendотрицательно или большеparameterCount(), либо еслиstartбольшеend
changeReturnType
public MethodType changeReturnType(Class<?> nrtype)
methodType.- Определено в:
-
changeReturnTypeв интерфейсеTypeDescriptor.OfMethod<Class<?>, MethodType> - Параметры:
-
nrtype— тип возвращаемого значения, заменяющий прежний - Возвращает:
- тот же тип, но с измененным типом возвращаемого значения
- Вызывает исключение:
-
NullPointerException— еслиnrtypeравен null
hasPrimitives
public boolean hasPrimitives()
void считается примитивным.- Возвращает:
- true, если любой из типов является примитивным
hasWrappers
public boolean hasWrappers()
Integer. Ссылочный тип java.lang.Void считается оберткой, если он используется как тип возвращаемого значения.- Возвращает:
- true, если любой из типов является типом-оберткой
erase
public MethodType erase()
Object. Вспомогательный метод для methodType. Все примитивные типы (включая void) останутся без изменений.- Возвращает:
- версию исходного типа, в которой заменены все ссылочные типы
generic
public MethodType generic()
Object. Вспомогательный метод для genericMethodType. Выражение type.wrap().erase() возвращает то же значение, что и type.generic().- Возвращает:
- версию исходного типа, в которой заменены все типы
wrap
public MethodType wrap()
methodType. Все ссылочные типы (включая типы-обертки) останутся без изменений. Тип возвращаемого значения void изменяется на тип java.lang.Void. Выражение type.wrap().erase() возвращает то же значение, что и type.generic().- Возвращает:
- версию исходного типа, в которой заменены все примитивные типы
unwrap
public MethodType unwrap()
methodType. Все примитивные типы (включая void) останутся без изменений. Тип возвращаемого значения java.lang.Void изменяется на void.- Возвращает:
- версию исходного типа, в которой заменены все типы-обертки
parameterType
public Class<?> parameterType(int num)
- Определено в:
-
parameterTypeв интерфейсеTypeDescriptor.OfMethod<Class<?>, MethodType> - Параметры:
-
num— индекс (начиная с нуля) требуемого типа параметра - Возвращает:
- выбранный тип параметра
- Вызывает исключение:
-
IndexOutOfBoundsException— еслиnumне является допустимым индексом вparameterArray()
parameterCount
public int parameterCount()
- Определено в:
-
parameterCountв интерфейсеTypeDescriptor.OfMethod<Class<?>, MethodType> - Возвращает:
- количество типов параметров
returnType
public Class<?> returnType()
- Определено в:
-
returnTypeв интерфейсеTypeDescriptor.OfMethod<Class<?>, MethodType> - Возвращает:
- тип возвращаемого значения
parameterList
public List<Class<?>> parameterList()
- Определено в:
-
parameterListв интерфейсеTypeDescriptor.OfMethod<Class<?>, MethodType> - Возвращает:
- типы параметров (в виде неизменяемого списка)
lastParameterType
public Class<?> lastParameterType()
void.class.- Примечание к API:
Значение-заполнитель выбрано таким образом, чтобы можно было непосредственно выполнять рефлексивные запросы к результату. Значение-заполнитель невозможно спутать с реальным параметром, поскольку
voidникогда не может быть допустимым типом параметра. Для режимов вызова с переменной арностью выражениеlastParameterType().getComponentType()удобно использовать для получения типа параметра «varargs».- Возвращает:
- тип последнего параметра, если он есть, иначе
void.class - Начиная с версии:
- 10
parameterArray
public Class<?>[] parameterArray()
- Определено в:
-
parameterArrayв интерфейсеTypeDescriptor.OfMethod<Class<?>, MethodType> - Возвращает:
- типы параметров (при необходимости — свежую копию)
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:
- Можно встретить типы методов с допустимыми дескрипторами, которые невозможно создать с помощью этого метода, поскольку их типы компонентов не видны из общего загрузчика классов.
Этот метод включен для приложений, которым необходимо генерировать байт-код для обработки дескрипторов методов и
invokedynamic. - Параметры:
-
descriptor— строка дескриптора метода -
loader— загрузчик классов, в котором следует искать типы - Возвращает:
- тип метода, соответствующий заданному дескриптору метода
- Вызывает исключение:
-
NullPointerException— если строка равнаnull -
IllegalArgumentException— если строка не является дескриптором метода -
TypeNotPresentException— если указанный тип не найден - См. Спецификацию виртуальной машины Java:
- 4.3.3 Дескрипторы методов
toMethodDescriptorString
public String toMethodDescriptorString()
MethodType::descriptorString.- Примечание к API:
- Этот метод не является строгой обратной операцией для
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.- Определено в:
-
descriptorStringв интерфейсеTypeDescriptor - Возвращает:
- строку дескриптора для этого типа метода
- См. Спецификацию виртуальной машины Java:
- 4.3.3 Дескрипторы методов
- Начиная с версии:
- 12
- См. также:
describeConstable
public Optional<MethodTypeDesc> describeConstable()
Optional, если создать его нельзя.- Определено в:
-
describeConstableв интерфейсеConstable - Возвращает:
Optional, содержащий полученный номинальный дескриптор, или пустойOptional, если создать его невозможно.- Начиная с версии:
- 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://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/invoke/MethodType.html