Класс 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 Virtual Machine.)
Когда JVM материализует MethodType из строки описания, все классы, указанные в описании, должны быть доступны и будут загружены. (Но классы не обязательно должны быть инициализированы, как в случае с CONSTANT_Class.) Эта загрузка может произойти в любое время до того, как объект MethodType будет впервые получен.
- С момента:
- 1.7
- См. также:
- Сериализованная форма
Методы
| Модификатор и тип | Метод | Описание |
|---|---|---|
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) | Находит или создает тип метода с дополнительными типами параметров. |
Class<?> | lastParameterType() | Возвращает последний тип параметра этого типа метода. |
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,
MethodType ptypes) | Находит или создает тип метода с заданными компонентами. |
static MethodType | methodType(Class<?> rtype,
List<Class<?>> 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истинно) - См. также:
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
изменение типа возвращаемого значения
public MethodType changeReturnType(Class<?> nrtype)
Находит или создает тип метода с другим типом возвращаемого значения. Удобный метод для methodType.
- Параметры:
-
nrtype- тип возвращаемого параметра, которым нужно заменить старый - Возвращает:
- тот же тип, за исключением изменения типа возвращаемого значения
- Исключения:
-
NullPointerException- еслиnrtypeравно null
содержит примитивные типы
public boolean hasPrimitives()
Указывает, содержит ли этот тип примитивный аргумент или возвращаемое значение. Тип возврата void считается примитивным.
- Возвращает:
- true, если какие-либо типы являются примитивными
содержит обертки
public boolean hasWrappers()
Указывает, содержит ли этот тип аргумент или возвращаемое значение в виде обертки. Обёртки — это типы, которые упаковывают примитивные значения, такие как Integer. Ссылочный тип java.lang.Void считается оболочкой, если он встречается в качестве типа возвращаемого значения.
- Возвращает:
- true, если какие-либо типы являются обёртками
стереть
public MethodType erase()
Стирает все ссылочные типы до Object. Удобный метод для methodType. Все примитивные типы (включая void) останутся неизменными.
- Возвращает:
- версию исходного типа со всеми ссылочными типами, заменёнными
обобщённый
public MethodType generic()
Преобразует все типы, как ссылочные, так и примитивные, в Object. Удобный метод для genericMethodType. Выражение type.wrap().erase() даёт тот же результат, что и type.generic().
- Возвращает:
- версию исходного типа со всеми типами, заменёнными
упаковать
public MethodType wrap()
Преобразует все примитивные типы в соответствующие типы-обёртки. Удобный метод для methodType. Все ссылочные типы (включая типы-обёртки) останутся неизменными. Тип возвращаемого значения void изменяется на тип java.lang.Void. Выражение type.wrap().erase() даёт тот же результат, что и type.generic().
- Возвращает:
- версию исходного типа со всеми примитивными типами, заменёнными
распаковать
public MethodType unwrap()
Преобразует все типы-обёртки в соответствующие примитивные типы. Удобный метод для methodType. Все примитивные типы (включая void) останутся неизменными. Тип возвращаемого значения java.lang.Void изменяется на void.
- Возвращает:
- версию исходного типа со всеми типами-обёртками, заменёнными
тип параметра
public Class<?> parameterType(int num)
Возвращает тип параметра по указанному индексу в этом типе метода.
- Параметры:
-
num- индекс (нумерация с нуля) нужного типа параметра - Возвращает:
- выбранный тип параметра
- Исключения:
-
IndexOutOfBoundsException- еслиnumне является допустимым индексом вparameterArray()
количество параметров
public int parameterCount()
Возвращает количество типов параметров в этом типе метода.
- Возвращает:
- количество типов параметров
тип возвращаемого значения
public Class<?> returnType()
Возвращает тип возвращаемого значения этого типа метода.
- Возвращает:
- тип возвращаемого значения
список параметров
public List<Class<?>> parameterList()
Представляет типы параметров в виде списка (удобный метод). Список будет неизменяемым.
- Возвращает:
- типы параметров (в виде неизменяемого списка)
последний тип параметра
public Class<?> lastParameterType()
Возвращает последний тип параметра этого типа метода. Если у этого типа нет параметров, возвращается значение-маркер void.class.
- Примечание API:
Значение-маркер выбрано таким образом, чтобы рефлексивные запросы могли быть сделаны непосредственно к результату. Значение-маркер не может быть спутано с реальным параметром, так как
voidникогда не является типом параметра. Для режимов вызова с переменным числом аргументов полезно использовать выражениеlastParameterType().getComponentType()для запроса типа параметра «varargs».- Возвращает:
- последний тип параметра, если он есть, иначе
void.class - С:
- 10
массив параметров
public Class<?>[] parameterArray()
Представляет типы параметров в виде массива (удобный метод). Изменения в массиве не приведут к изменениям в типе.
- Возвращает:
- типы параметров (как свежая копия, если необходимо)
равенство
public boolean equals(Object x)
Сравнивает указанный объект с этим типом на предмет равенства. То есть возвращает true тогда и только тогда, когда указанный объект также является типом метода с точно такими же параметрами и типом возвращаемого значения.
- Переопределяет:
-
equalsв классеObject - Параметры:
-
x- объект для сравнения - Возвращает:
-
trueесли этот объект такой же, как аргумент obj;falseв противном случае. - См. также:
Object.equals(Object)
хеш-код
public int hashCode()
Возвращает значение хеш-кода для этого типа метода. Оно определяется как хеш-код списка, элементами которого являются тип возвращаемого значения, за которым следуют типы параметров.
- Переопределяет:
-
hashCodeв классеObject - Возвращает:
- значение хеш-кода для этого типа метода
- См. также:
-
Object.hashCode(),List.hashCode(),equals(Object)
строковое представление
public String toString()
Возвращает строковое представление типа метода в формате "(PT0,PT1...)RT". Строковое представление типа метода — это список типов, заключенный в скобки, разделенные запятыми, и немедленно за ним следует тип возвращаемого значения.
Каждый тип представлен своим simple name.
из строки описателя метода
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- если имя типа не найдено
в строку описателя метода
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.
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/invoke/MethodType.html