Класс MethodType
- java.lang.Object
-
- java.lang.invoke.MethodType
- Все реализованные интерфейсы:
- Serializable
public final class MethodType extends Object implements Serializable
Тип метода представляет аргументы и возвращаемый тип, принимаемые и возвращаемые обработчиком метода, или аргументы и возвращаемый тип, передаваемые и ожидаемые вызывающим обработчиком метода. Типы методов должны быть правильно сопоставлены между обработчиком метода и всеми его вызывающими сторонами, и операции JVM обеспечивают это соответствие при, конкретно, вызовах 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 |
appendParameterTypes(Class<?>... ptypesToInsert) Находит или создаёт тип метода с дополнительными типами параметров. |
MethodType |
appendParameterTypes(List<Class<?>> ptypesToInsert) Находит или создаёт тип метода с дополнительными типами параметров. |
MethodType |
changeParameterType(int num,
Class<?> nptype) Находит или создаёт тип метода с одним изменённым типом параметра. |
MethodType |
changeReturnType(Class<?> nrtype) Находит или создаёт тип метода с другим возвращаемым типом. |
MethodType |
dropParameterTypes(int start,
int end) Находит или создаёт тип метода с пропущенными типами параметров. |
boolean |
equals(Object x) Сравнивает указанный объект с этим типом на равенство. |
MethodType |
erase() Удаляет все типы ссылок до |
static MethodType |
fromMethodDescriptorString(String descriptor,
ClassLoader loader) Находит или создаёт экземпляр типа метода, заданного формой его описания байт-кода. |
MethodType |
generic() Преобразует все типы, как ссылочные, так и примитивные, в |
static MethodType |
genericMethodType(int objectArgCount) Находит или создаёт тип метода, все компоненты которого являются |
static MethodType |
genericMethodType(int objectArgCount,
boolean finalArray) Находит или создаёт тип метода, компоненты которого являются |
int |
hashCode() Возвращает значение кода хэша для этого типа метода. |
boolean |
hasPrimitives() Сообщает, содержит ли этот тип примитивный аргумент или возвращаемое значение. |
boolean |
hasWrappers() Сообщает, содержит ли этот тип обёртку аргумента или возвращаемого значения. |
MethodType |
insertParameterTypes(int num,
Class<?>... ptypesToInsert) Находит или создаёт тип метода с дополнительными типами параметров. |
MethodType |
insertParameterTypes(int num,
List<Class<?>> ptypesToInsert) Находит или создаёт тип метода с дополнительными типами параметров. |
static MethodType |
methodType(Class<?> rtype) Находит или создаёт тип метода с заданными компонентами. |
static MethodType |
methodType(Class<?> rtype,
Class<?> ptype0) Находит или создаёт тип метода с заданными компонентами. |
static MethodType |
methodType(Class<?> rtype,
Class<?>[] ptypes) Находит или создаёт экземпляр указанного типа метода. |
static MethodType |
methodType(Class<?> rtype,
Class<?> ptype0,
Class<?>... ptypes) Находит или создаёт тип метода с заданными компонентами. |
static MethodType |
methodType(Class<?> rtype,
List<Class<?>> ptypes) Находит или создаёт тип метода с заданными компонентами. |
static MethodType |
methodType(Class<?> rtype,
MethodType ptypes) Находит или создаёт тип метода с заданными компонентами. |
Class<?>[] |
parameterArray() Представляет типы параметров как массив (метод для удобства). |
int |
parameterCount() Возвращает количество типов параметров в этом типе метода. |
List<Class<?>> |
parameterList() Представляет типы параметров как список (метод для удобства). |
Class<?> |
parameterType(int num) Возвращает тип параметра в указанном индексе в этом типе метода. |
Class<?> |
returnType() Возвращает возвращаемый тип этого типа метода. |
String |
toMethodDescriptorString() Создаёт представление описателя типа байт-кода. |
String |
toString() Возвращает строковое представление типа метода в виде |
MethodType |
unwrap() Преобразует все типы обёрток в соответствующие примитивные типы. |
MethodType |
wrap() Преобразует все примитивные типы в соответствующие типы обёрток. |
Методы, унаследованные от класса java.lang.Object
clone, finalize, getClass, notify, notifyAll, wait, wait, wait Методы
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(int)
genericMethodType
public static MethodType genericMethodType(int objectArgCount)
Находит или создаёт тип метода, компоненты которого являются всеми Object. Удобный метод для methodType. Все параметры и тип возврата будут Object.
- Параметры:
-
objectArgCount- количество параметров - Возвращает:
- универсальный тип метода для всех вызовов с заданным количеством аргументов
- Исключение:
-
IllegalArgumentException- еслиobjectArgCountотрицательно или больше 255 - См. также:
genericMethodType(int, boolean)
changeParameterType
public MethodType changeParameterType(int num,
Class<?> nptype) Находит или создаёт тип метода с единственным изменённым типом параметра. Удобный метод для methodType.
- Параметры:
-
num- индекс (от нуля) типа параметра, который нужно изменить -
nptype- новый тип параметра, которым нужно заменить старый - Возвращает:
- тот же тип, но с изменённым указанным параметром
- Исключение:
-
IndexOutOfBoundsException- еслиnumне является корректным индексом дляparameterArray() -
IllegalArgumentException- еслиnptypeравенvoid.class -
NullPointerException- еслиnptypeравен null
insertParameterTypes
public MethodType insertParameterTypes(int num,
Class<?>... ptypesToInsert) Находит или создаёт тип метода с дополнительными типами параметров. Удобный метод для 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.
- Параметры:
-
start- индекс (с нуля) первого типа параметра, который нужно удалить -
end- индекс (большеstart) первого типа параметра, после которого не нужно удалять - Возвращает:
- тот же тип, за исключением удаленных параметров
- Выбрасывает:
-
IndexOutOfBoundsException- еслиstartотрицательный или большеparameterCount(), или еслиendотрицательный или большеparameterCount(), или еслиstartбольшеend
changeReturnType
public MethodType changeReturnType(Class<?> nrtype)
Находит или создаёт тип метода с другим типом возвращаемого значения. Удобный метод для 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)
Возвращает тип параметра по указанному индексу в этом типе метода.
- Параметры:
-
num- индекс (с нуля) нужного типа параметра - Возвращает:
- выбранный тип параметра
- Выбрасывает:
-
IndexOutOfBoundsException- еслиnumне является допустимым индексом вparameterArray()
parameterCount
public int parameterCount()
Возвращает количество типов параметров в этом типе метода.
- Возвращает:
- количество типов параметров
returnType
public Class<?> returnType()
Возвращает тип возвращаемого значения этого типа метода.
- Возвращает:
- тип возвращаемого значения
parameterList
public List<Class<?>> parameterList()
Представляет типы параметров в виде списка (удобный метод). Список будет неизменяемым.
- Возвращает:
- типы параметров (в виде неизменяемого списка)
parameterArray
public Class<?>[] parameterArray()
Представляет типы параметров в виде массива (удобный метод). Изменения в массиве не повлияют на тип.
- Возвращает:
- типы параметров (как новая копия, если необходимо)
equals
public boolean equals(Object x)
Сравнивает указанный объект с этим типом на равенство. То есть, возвращает true тогда и только тогда, когда указанный объект также является типом метода с точно такими же параметрами и типом возвращаемого значения.
- Переопределяет:
-
equalsв классеObject - Параметры:
-
x- объект для сравнения - Возвращает:
-
true, если этот объект такой же, как аргумент obj;falseв противном случае. - См. также:
Object.equals(Object)
hashCode
public int hashCode()
Возвращает хэш-код для этого типа метода. Он определён как хэш-код списка, элементы которого — тип возвращаемого значения, за которым следуют типы параметров.
- Переопределяет:
-
hashCodeв классеObject - Возвращает:
- значение хэш-кода для этого типа метода
- См. также:
-
Object.hashCode(),equals(Object),List.hashCode()
toString
public String toString()
Возвращает строковое представление типа метода в форме "(PT0,PT1...)RT". Строковое представление типа метода — это заключённый в скобки список типов, разделённых запятыми, сразу после типа возвращаемого значения.
Каждый тип представлен его simple name.
fromMethodDescriptorString
public static MethodType fromMethodDescriptorString(String descriptor,
ClassLoader loader)
throws IllegalArgumentException,
TypeNotPresentException Находит или создаёт экземпляр типа метода, заданного строкой описателя байт-кода. Удобный метод для methodType. Любое имя класса или интерфейса, вставленное в строку описателя, будет разрешено с помощью вызова ClassLoader.loadClass(java.lang.String) на заданном загрузчике (или, если он null, на системном загрузчике классов).
Обратите внимание, что могут встречаться типы методов, которые нельзя создать с помощью этого метода, потому что их компоненты типов недоступны из общего загрузчика классов.
Этот метод включён для удобства приложений, которые должны генерировать байт-код для обработки обработчиков методов и invokedynamic.
- Параметры:
-
descriptor- строка описателя типа байт-кода "(T...)T" -
loader- загрузчик классов для поиска типов - Возвращает:
- тип метода, соответствующий строке описателя типа байт-кода
- Выбрасывает:
-
NullPointerException- если строка равна null -
IllegalArgumentException- если строка не имеет правильного формата -
TypeNotPresentException- если имя типа не найдено
toMethodDescriptorString
public String toMethodDescriptorString()
Создаёт строку-описатель типа метода в представлении байт-кода.
Обратите внимание, что это не строго обратная функция fromMethodDescriptorString. Два разных класса, которые имеют общее имя, но разные загрузчики классов, будут выглядеть идентично в строках описателей.
Этот метод включён для удобства приложений, которые должны генерировать байт-код для обработки обработчиков методов и invokedynamic. fromMethodDescriptorString, потому что последний требует аргумента загрузчика классов.
- Возвращает:
- представление типа описателя байт-кода
© 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.