Spec-Zone .ru
спецификации, руководства, описания, API
|
java.lang.invoke
пакет содержит динамическую поддержку языка, оказанную непосредственно библиотеками классов ядра Java и виртуальной машиной.См.: Описание
Класс | Описание |
---|---|
CallSite | |
ConstantCallSite |
A
ConstantCallSite a CallSite чья цель является постоянной, и никогда не может изменяться. |
MethodHandle |
Дескриптор метода является введенной, непосредственно исполнимой ссылкой на базовый метод, конструктора, поле, или подобную низкоуровневую операцию, с дополнительными преобразованиями параметров или возвращаемых значений.
|
MethodHandleProxies |
Этот класс состоит исключительно из статических методов, что справка адаптирует дескрипторы метода к другим типам JVM, таким как интерфейсы.
|
MethodHandles |
Этот класс состоит исключительно из статических методов, которые работают на или дескрипторы метода возврата.
|
MethodHandles. Поиск |
Объект поиска является фабрикой для того, чтобы создать дескрипторы метода, когда создание требует проверки доступа.
|
MethodType |
Тип метода представляет параметры и тип возврата, принятый и возвращенный дескриптором метода, или параметрами и типом возврата, который передают и ожидаемый вызывающей стороной дескриптора метода.
|
MutableCallSite |
A
MutableCallSite a CallSite чья целевая переменная ведет себя как обычное поле. |
SwitchPoint |
A
SwitchPoint объект, который может опубликовать изменения состояния к другим потокам. |
VolatileCallSite |
A
VolatileCallSite a CallSite чья цель действует как энергозависимая переменная. |
Исключение | Описание |
---|---|
WrongMethodTypeException |
Брошенный, чтобы указать, что код попытался вызвать дескриптор метода через неправильный тип метода.
|
java.lang.invoke
пакет содержит динамическую поддержку языка, оказанную непосредственно библиотеками классов ядра Java и виртуальной машиной. Как описано в Спецификации виртуальной машины Java, у определенных типов в этом пакете есть специальные отношения к динамической поддержке языка в виртуальной машине:
MethodHandle
содержит подпись полиморфные методы, которые могут быть соединены независимо от их дескриптора типа. Обычно, редактирование метода требует точного соответствия дескрипторов типа. MethodHandle
и MethodType
. invokedynamic
инструкцию вызывают динамическим сайтом вызова. invokedynamic
инструкции Прежде, чем JVM может выполнить динамический сайт вызова ( invokedynamic
инструкция), сайт вызова должен сначала быть соединен. Соединение выполняется, вызывая метод начальной загрузки, которому дают статический информационный контент сайта вызова, и который должен произвести a method handle
это дает поведение сайта вызова.
Каждый invokedynamic
инструкция статически определяет свой собственный метод начальной загрузки как постоянную ссылку пула. Постоянная ссылка пула также определяет имя сайта вызова и дескриптор типа, точно так же как invokevirtual
и другой вызывать инструкции.
Соединение запускается с разрешения постоянной записи пула для метода начальной загрузки, и разрешения a MethodType
объект для дескриптора типа динамического сайта вызова. Этот процесс разрешения может инициировать загрузку класса. Это может поэтому бросить ошибку, если класс не в состоянии загрузиться. Эта ошибка становится аварийным завершением динамического выполнения сайта вызова. Редактирование не инициировало инициализацию класса.
Метод начальной загрузки вызывается по крайней мере на три значения:
MethodHandles.Lookup
, объект поиска на классе вызывающей стороны, в котором происходит динамический сайт вызова String
, имя метода упоминается в сайте вызова MethodType
, разрешенный дескриптор типа вызова MethodHandle.invoke
. Возвращенным результатом должен быть a CallSite
(или подкласс). Тип цели сайта вызова должен быть точно равным типу, полученному из динамического дескриптора типа сайта вызова, и передал к методу начальной загрузки. Сайт вызова тогда становится постоянно соединенным с динамическим сайтом вызова. Как задокументировано в спецификации JVM, обо всех отказах, являющихся результатом редактирования динамического сайта вызова, сообщает a BootstrapMethodError
, который бросается как аварийное завершение динамического выполнения сайта вызова. Если это произойдет, то та же самая ошибка будет брошенный для всех последующих попыток выполнить динамический сайт вызова.
Если есть несколько таких потоков, метод начальной загрузки может быть вызван в нескольких потоках одновременно. Поэтому, загрузите методы, какие глобальные данные приложения доступа должны взять обычные предосторожности против условий гонки. В любом случае, каждый invokedynamic
инструкция или расцепляется или соединяется с уникальным CallSite
объект.
В приложении, которое требует динамических сайтов вызова с индивидуально изменчивыми поведениями, их методы начальной загрузки должны произвести отличный CallSite
объекты, один для каждого запроса редактирования. Альтернативно, приложение может соединить сингл CallSite
возразите против нескольких invokedynamic
инструкции, когда изменение к целевому методу станет видимым в каждой из инструкций.
Если несколько потоков одновременно выполняют метод начальной загрузки для единственного динамического сайта вызова, JVM должна выбрать тот CallSite
объект и установка это явно ко всем потокам. Любым другим вызовам метода начальной загрузки позволяют завершиться, но их результаты игнорируются, и их динамические вызовы сайта вызова продолжаются с первоначально выбранным целевым объектом.
Обсуждение: Эти правила не позволяют JVM копировать динамические сайты вызова, или выпустить "беспричинные" вызовы метода начальной загрузки. Каждый динамический сайт вызова переходы самое большее однажды от расцепляемого до соединенного, как раз перед его первым вызовом. Нет никакого способа отменить эффект завершенного вызова метода начальной загрузки.
MethodHandle.invoke
, его подробный тип произволен. Например, первый параметр мог быть Object
вместо MethodHandles.Lookup
, и тип возврата мог также быть Object
вместо CallSite
. (Отметьте, что типы и число сложенных параметров ограничивают юридические виды методов начальной загрузки к соответственно введенным статическим методам и конструкторам CallSite
подклассы.) Если данный invokedynamic
инструкция не определяет статических параметров, метод начальной загрузки инструкции будет вызван на три параметра, передавая класс вызывающей стороны инструкции, имя, и тип метода. Если invokedynamic
инструкция определяет один или более статических параметров, те значения передадут как дополнительные параметры дескриптору метода. (Отметьте, что, потому что есть предел 255 параметров любому методу, самое большее 251 дополнительный параметр может быть предоставлен, так как дескриптор метода начальной загрузки непосредственно и его первые три параметра должны также быть сложены.) Метод начальной загрузки будет вызван как будто также MethodHandle.invoke
или invokeWithArguments
. (Нет никакого способа сказать различие.)
Нормальное преобразование параметра управляет для MethodHandle.invoke
применитесь ко всем сложенным параметрам. Например, если продвинутое значение является типом примитива, оно может быть преобразовано в ссылку, упаковывая преобразование. Если метод начальной загрузки является переменным методом арности (его бит модификатора 0x0080
устанавливается), тогда некоторые или все параметры, определенные здесь, могут быть забраны в запаздывающий параметр массива. (Это не специальное правило, а скорее полезное последствие взаимодействия между CONSTANT_MethodHandle
константы, бит модификатора для переменных методов арности, и asVarargsCollector
преобразование.)
Учитывая эти правила, вот примеры юридических объявлений метода начальной загрузки учитывая различные числа N
из дополнительных параметров. Первые строки (отмеченный *
) будет работать на любое число дополнительных параметров.
N | демонстрационный метод начальной загрузки |
---|---|
* | CallSite bootstrap(Lookup caller, String name, MethodType type, Object... args) |
* | CallSite bootstrap(Object... args) |
* | CallSite bootstrap(Object caller, Object... nameAndTypeWithArgs) |
0 | CallSite bootstrap(Lookup caller, String name, MethodType type) |
0 | CallSite bootstrap(Lookup caller, Object... nameAndType) |
1 | CallSite bootstrap(Lookup caller, String name, MethodType type, Object arg) |
2 | CallSite bootstrap(Lookup caller, String name, MethodType type, Object... args) |
2 | CallSite bootstrap(Lookup caller, String name, MethodType type, String... args) |
2 | CallSite bootstrap(Lookup caller, String name, MethodType type, String x, int y) |
CONSTANT_String
и CONSTANT_Integer
, соответственно. Предпоследний пример предполагает, что все дополнительные параметры имеют тип CONSTANT_String
. Другие примеры работают со всеми типами дополнительных параметров. Как отмечено выше, фактический тип метода метода начальной загрузки может измениться. Например, четвертый параметр мог быть MethodHandle
, если это - тип соответствующей константы в CONSTANT_InvokeDynamic
запись. В этом случае, MethodHandle.invoke
вызов передаст дополнительный дескриптор метода, постоянный как Object
, но машина соответствия типа MethodHandle.invoke
бросит ссылку назад на MethodHandle
прежде, чем вызвать метод начальной загрузки. (Если бы строковую константу передали вместо этого, ужасно сгенерированным кодом, которые бросают, то тогда перестал бы работать, приводя к a BootstrapMethodError
.)
Дополнительные параметры метода начальной загрузки предназначаются, чтобы позволить конструкторам языка безопасно и сжато закодировать метаданные. В принципе имя и дополнительные параметры избыточны, так как каждому сайту вызова можно было дать его собственный уникальный метод начальной загрузки. Такая практика, вероятно, произведет большие файлы класса и постоянные пулы.
Для дальнейшей ссылки API и документации разработчика, см.
Авторское право © 1993, 2011, Oracle и/или его филиалы. Все права защищены.