Spec-Zone .ru
спецификации, руководства, описания, API
|
public class LambdaMetafactory extends Object
Методы начальной загрузки для того, чтобы преобразовать лямбда-выражения и ссылки метода на функциональные объекты интерфейса.
Для каждого лямбда-выражения или ссылка метода в исходном коде, есть целевой тип, который является функциональным интерфейсом. Оценка лямбда-выражения производит объект своего целевого типа. Механизм для того, чтобы оценить лямбда-выражения должен вызвать сайт вызова invokedynamic, который берет параметры, описывающие единственный метод функционального интерфейса и метод реализации, и возвращает объект (объект лямбды), который реализует целевой тип. Методы объекта лямбды вызывают метод реализации. Для ссылок метода метод реализации является просто методом, на который ссылаются; для лямбда-выражений метод реализации производится компилятором, основанным на теле лямбда-выражения. Методы в этом файле являются методами начальной загрузки для тех сайтов вызова invokedynamic, названных фабриками лямбды, и методы начальной загрузки, ответственные за соединение фабрик лямбды, вызывают метафабриками лямбды.
Методы начальной загрузки в этом class берут информацию о функциональном интерфейсе, методе реализации, и статических типах полученных параметров лямбды, и соединяют сайт вызова, который, когда вызвано, производит объект лямбды.
Когда параметризованные типы используются, инстанцированный тип функционального метода интерфейса может отличаться от этого в функциональном интерфейсе. Например, рассмотреть interface I<T> { int m(T x); }
если этот функциональный тип интерфейса используется в лямбде I<Byte> v = ...
, мы нуждаемся в обоих фактический функциональный метод интерфейса, у которого есть подпись (Object)int
и стертый инстанцированный тип функционального метода интерфейса (или просто инстанцированный тип метода), у которого есть подпись (Byte)int
.
В то время как у функциональных интерфейсов только есть единственный абстрактный метод с точки зрения языка (конкретные методы в Объекте, и методы значения по умолчанию могут присутствовать), на уровне байт-кода, у них могут фактически быть многократные методы из-за потребности в мостовых методах. Вызов любого из этих методов на объекте лямбды приведет к вызову метода реализации.
Список параметров метода реализации и список параметров функционального метода (ов) интерфейса могут отличаться несколькими способами. У методов реализации могут быть дополнительные параметры, чтобы разместить параметры, полученные лямбда-выражением; могут также быть различия, следующие из разрешенной адаптации параметров, такой как бросок, упаковка, распаковывание, и примитивное расширение. Они могут также отличаться из-за var-args, но это, как ожидают, будет обработано компилятором.
У сайтов вызова Invokedynamic есть два списка параметров: статический список параметров и динамический список параметров. Статический список параметров живет в постоянном пуле; динамический список параметров живет на стек операнда во время вызова. У метода начальной загрузки есть доступ ко всему статическому списку параметров (который в этом случае, содержит описание дескрипторов метода метода реализации и канонического функционального метода интерфейса), так же как сигнатура метода, описывающая число и статические типы (но не значения) динамических параметров, и статического типа возврата invokedynamic сайта.
Метод реализации описывается с дескриптором метода. В теории мог использоваться любой дескриптор метода. В настоящий момент поддерживаемый дескрипторы метода, представляющие вызов виртуальных, интерфейса, конструктора и статических методов.
Примите:
Следующие инварианты подписи должны содержать:
Отметьте, что потенциально параметризованный тип возврата реализации предоставляет значение СЭМУ. Принимая во внимание, что полностью известный инстанцированный тип возврата адаптируется к параметрам реализации. Поскольку инстанцированный тип метода реализации не доступен, адаптируемость типов возврата не может быть проверена так точно в разовом ссылкой, как параметры могут быть проверены. Таким образом свободная версия разовой ссылкой проверки делается на типе возврата, в то время как строгая версия применяется к параметрам.
Тип Q считают адаптируемым к S следующим образом:
Q | S | Разовые ссылкой проверки | Разовые получением проверки |
---|---|---|---|
Примитивный | Примитивный | Q может быть преобразован в S через примитивное расширяющееся преобразование | Ни один |
Примитивный | Ссылка | S является супертипом Обертки (Q) | Бросок от Обертки (Q) к S |
Ссылка | Примитивный | строгий: Q является примитивной оберткой, и Примитивный (Q) может быть расширен до S свободный: Если Q является примитивной оберткой, проверьте, что Примитивный (Q) может быть расширен до S |
Если Q не является примитивной оберткой, бросьте Q к основной Обертке (S); например Число для числовых типов |
Ссылка | Ссылка | строгий: S является супертипом Q свободный: ни один |
Бросок от Q до S |
metaFactory(java.lang.invoke.MethodHandles.Lookup, java.lang.String, java.lang.invoke.MethodType, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodType)
) представляет общие падежи и использует оптимизированный протокол. Альтернативные начальные загрузки (например, altMetaFactory(java.lang.invoke.MethodHandles.Lookup, java.lang.String, java.lang.invoke.MethodType, java.lang.Object...)
) существуйте, чтобы поддерживать редкие случаи, такие как сериализация или дополнительные суперинтерфейсы маркера.Модификатор и Тип | Поле и Описание |
---|---|
static int |
FLAG_MARKERS
Флаг для альтернативных метафабрик, указывающих на объект лямбды, реализует другие интерфейсы маркера помимо Сериализуемого
|
static int |
FLAG_SERIALIZABLE
Флаг для альтернативных метафабрик, указывающих на объект лямбды, должен, чтобы быть сериализуемым
|
Конструктор и Описание |
---|
LambdaMetafactory() |
Модификатор и Тип | Метод и Описание |
---|---|
static CallSite |
altMetaFactory(MethodHandles.Lookup caller, String invokedName, MethodType invokedType, Object... args)
Альтернативная метафабрика для преобразования лямбда-выражений или ссылок метода на функциональные интерфейсы, который поддерживает сериализацию и другие редкие опции.
|
static CallSite |
metaFactory(MethodHandles.Lookup caller, String invokedName, MethodType invokedType, MethodHandle samMethod, MethodHandle implMethod, MethodType instantiatedMethodType)
Стандартная метафабрика для преобразования лямбда-выражений или ссылок метода на функциональные интерфейсы.
|
public static final int FLAG_SERIALIZABLE
public static final int FLAG_MARKERS
public static CallSite metaFactory(MethodHandles.Lookup caller, String invokedName, MethodType invokedType, MethodHandle samMethod, MethodHandle implMethod, MethodType instantiatedMethodType) throws ReflectiveOperationException, LambdaConversionException
caller
- Сложенный автоматически VM; представляет контекст поиска с полномочиями доступности вызывающей стороны.invokedName
- Сложенный автоматически VM; имя вызванного метода, как это появляется на сайте вызова. В настоящий момент неиспользованный.invokedType
- Сложенный автоматически VM; подпись вызванного метода, который включает ожидаемый статический тип возвращенного объекта лямбды, и статические типы полученных параметров за лямбду. Когда метод реализации является методом экземпляра, первый параметр в подписи вызова будет соответствовать получателю.samMethod
- Основной метод в функциональном интерфейсе, в который преобразовывается ссылка лямбды или метода, представлял как дескриптор метода.implMethod
- Метод реализации, который нужно вызвать (с подходящей адаптацией типов параметра, возвратите типы, и корректировку к полученным параметрам), когда методы получающегося функционального экземпляра интерфейса вызываются.instantiatedMethodType
- Подписью основного функционального метода интерфейса после переменных типа заменяют с их инстанцированием от сайта полученияReflectiveOperationException
LambdaConversionException
- Если какой-либо из инвариантов протокола метафабрики нарушаетсяpublic static CallSite altMetaFactory(MethodHandles.Lookup caller, String invokedName, MethodType invokedType, Object... args) throws ReflectiveOperationException, LambdaConversionException
caller
- Сложенный автоматически VM; представляет контекст поиска с полномочиями доступности вызывающей стороны.invokedName
- Сложенный автоматически VM; имя вызванного метода, как это появляется на сайте вызова. В настоящий момент неиспользованный.invokedType
- Сложенный автоматически VM; подпись вызванного метода, который включает thefu ожидаемый статический тип возвращенного объекта лямбды, и статические типы полученных параметров за лямбду. Когда метод реализации является методом экземпляра, первый параметр в подписи вызова будет соответствовать получателю.args
- параметр передаче, флагам, количеству интерфейса маркера, и маркеру взаимодействует через интерфейс как описано вышеReflectiveOperationException
LambdaConversionException
- Если какой-либо из инвариантов протокола метафабрики нарушается
Для дальнейшей ссылки API и документации разработчика, см. Java Документация SE. Та документация содержит более подробные, предназначенные разработчиком описания, с концептуальными краткими обзорами, определениями сроков, обходных решений, и рабочих примеров кода.
Авторское право © 1993, 2013, Oracle и/или его филиалы. Все права защищены.
Проект сборка-b92