Класс 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> | Модификатор и тип | Интерфейс | Описание |
|---|---|---|
static interface |
TypeDescriptor.OfField<F extends TypeDescriptor.OfField<F>> |
Сущность, имеющая дескриптор типа поля. |
static interface |
TypeDescriptor.OfMethod<F extends TypeDescriptor.OfField<F>, M extends TypeDescriptor.OfMethod<F, |
Сущность, имеющая дескриптор типа метода. Дескрипторы методов, соответствующие JVMS §4.3.3, можно описать номинально с помощью MethodType::describeConstable; в противном случае их нельзя описать номинально. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
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() |
Преобразует все примитивные типы в соответствующие типы-оболочки. |
Методы, объявленные в классе Object
clone, finalize, getClass, notify, notifyAll, wait, wait, wait | Модификатор и тип | Метод | Описание |
|---|---|---|
protected Object |
clone() |
Создает и возвращает копию этого объекта. |
protected void |
finalize() |
Устарело, будет удалено: этот элемент API подлежит удалению в будущей версии. Финализация объявлена устаревшей и подлежит удалению в одном из будущих выпусков. |
final Class |
getClass() |
Возвращает класс времени выполнения этого объекта Object. |
final void |
notify() |
Пробуждает один поток, ожидающий на мониторе этого объекта. |
final void |
notifyAll() |
Пробуждает все потоки, ожидающие на мониторе этого объекта. |
final void |
wait() |
Заставляет текущий поток ожидать пробуждения, обычно в результате вызова notify или interrupt. |
final void |
wait |
Заставляет текущий поток ожидать пробуждения, обычно в результате вызова notify или interrupt, либо до истечения заданного промежутка реального времени. |
final void |
wait |
Заставляет текущий поток ожидать пробуждения, обычно в результате вызова notify или interrupt, либо до истечения заданного промежутка реального времени. |
Подробное описание методов
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:
Значение-заполнитель выбрано таким образом, чтобы запросы через reflection можно было выполнять непосредственно для возвращенного значения. Его невозможно спутать с реальным параметром, поскольку
voidникогда не может быть допустимым типом параметра. Для режимов вызова с переменным количеством аргументов полезно использовать выражениеlastParameterType().getComponentType(), чтобы запросить тип параметра «varargs».- Возвращает:
- тип последнего параметра, если он есть, иначе
void.class - С версии:
- 10
parameterArray
public Class<?>[] parameterArray()
- Указано в:
-
parameterArrayв интерфейсеTypeDescriptor.OfMethod<Class<?>, MethodType> - Возвращает:
- типы параметров (при необходимости — в виде новой копии)
equals
public boolean equals(Object x)
true тогда и только тогда, когда указанный объект также является типом метода с точно такими же параметрами и типом возвращаемого значения.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.