Spec-Zone .ru
спецификации, руководства, описания, API
|
public static final class MethodHandles.Lookup extends Object
Класс поиска, который должен создать дескрипторы метода, вызовет MethodHandles.lookup
создать фабрику для себя. Когда Lookup
объект фабрики создается, идентификационные данные класса поиска определяются, и надежно сохранены в Lookup
объект. Класс поиска (или его делегаты) может тогда использовать методы фабрики на Lookup
объект создать дескрипторы метода для проверенных в доступе элементов. Это включает все методы, конструкторов, и поля, которые позволяются классу поиска, даже частным.
Методы фабрики на a Lookup
объект соответствует всем главным вариантам использования для методов, конструкторов, и полей. Вот является сводка корреспонденции между этими методами фабрики и поведением получающимися дескрипторами метода:
Здесь, тип
lookup expression member behavior
lookup.findGetter (C.class, "f", FT.class)
FT f; (T) this.f;
lookup.findStaticGetter (C.class, "f", FT.class)
static
FT f;(T) C.f;
lookup.findSetter (C.class, "f", FT.class)
FT f; this.f = x;
lookup.findStaticSetter (C.class, "f", FT.class)
static
FT f;C.f = arg;
lookup.findVirtual (C.class, "м.", MT)
T m(A*); (T) this.m(arg*);
lookup.findStatic (C.class, "м.", MT)
static
T m(A*);(T) C.m(arg*);
lookup.findSpecial (C.class, "м.", MT, this.class)
T m(A*); (T) super.m(arg*);
lookup.findConstructor (C.class, Монтана)
C(A*); (T) new C(arg*);
lookup.unreflectGetter (далеко от дома)
(static)?
FT f;(FT) aField.get(thisOrNull);
lookup.unreflectSetter (далеко от дома)
(static)?
FT f;aField.set(thisOrNull, arg);
lookup.unreflect (aMethod)
(static)?
T m(A*);(T) aMethod.invoke(thisOrNull, arg*);
lookup.unreflectConstructor (aConstructor)
C(A*); (C) aConstructor.newInstance(arg*);
lookup.unreflect (aMethod)
(static)?
T m(A*);(T) aMethod.invoke(thisOrNull, arg*);
C
класс или интерфейс, искавший элемент, задокументированный в качестве параметра названный refc
в методах поиска. Метод или тип конструктора MT
составляется из типа возврата T
и последовательность типов параметра A*
. Оба MT
и тип поля FT
документируются в качестве параметра названные type
. Формальный параметр this
стенды для самоссылки типа C
; если это присутствует, это всегда - ведущий параметр вызову дескриптора метода. Имя arg
стенды для всех других параметров дескриптора метода. В примерах кода для Базового API Reflection, имени thisOrNull
стенды для нулевой ссылки, если метод, к которому получают доступ, или поле статичны, и this
иначе. Имена aMethod
, aField
, и aConstructor
стенд для отражающих объектов, соответствующих данным элементам.
В случаях, где данный элемент имеет переменную арность (то есть, метод или конструктор) возвращенный дескриптор метода будет также иметь переменную арность. Во всех других случаях возвращенный дескриптор метода будет иметь фиксированную арность.
Эквивалентность между смотревшими дескрипторами метода и базовыми элементами класса может сломаться несколькими способами:
C
не символически доступно от загрузчика класса поиска, поиск может все еще успешно выполниться, даже когда нет никакого эквивалентного выражения Java или bytecoded константы. T
или MT
не символически доступно от загрузчика класса поиска, поиск может все еще успешно выполниться. Например, поиски для MethodHandle.invokeExact
и MethodHandle.invoke
будет всегда успешно выполняться, независимо от требуемого типа. ldc
инструкция не подвергается проверкам менеджера безопасности. Lookup
, когда дескриптор метода создается. Это - основное отличие от Базового API Reflection с тех пор java.lang.reflect.Method.invoke
выполняет проверку доступа против каждой вызывающей стороны, на каждом вызове. Все проверки прав доступа запускаются с a Lookup
объект, который сравнивает его записанный класс поиска со всеми запросами, чтобы создать дескрипторы метода. Сингл Lookup
объект может использоваться, чтобы создать любое число проверенных в доступе дескрипторов метода, все проверенные по единственному классу поиска.
A Lookup
объект может быть совместно использован с другим доверяемым кодом, таким как протокол метаобъекта. Совместно используемое Lookup
возразите делегирует возможность создать дескрипторы метода на членах парламента, не занимающих официального поста класса поиска. Даже если привилегированный код использует Lookup
объект, проверка доступа ограничивается полномочиями исходного класса поиска.
Поиск может перестать работать, потому что содержание класса не доступно для класса поиска, или потому что требуемый элемент класса отсутствует, или потому что требуемый элемент класса не доступен для класса поиска. В любом из этих случаев, a ReflectiveOperationException
будет брошен от предпринятого поиска. Точный класс будет одним из следующего:
Вообще, условия, при которых дескриптор метода может искаться метод M
точно эквивалентны условиям, при которых класс поиска, возможно, скомпилировал и разрешил звонок M
. И эффект вызова дескриптора метода, следующего из поиска, точно эквивалентен выполнению скомпилированного и разрешенного звонка M
. Та же самая точка верна для полей и конструкторов.
В некоторых случаях доступ между вложенными классами получается компилятором Java, создавая метод обертки, чтобы получить доступ к закрытому методу другого класса в том же самом высокоуровневом объявлении. Например, вложенный класс C.D
может получить доступ к членам парламента, не занимающим официального поста в пределах других связанных классов такой как C
, C.D.E
, или C.B
, но компилятор Java, возможно, должен генерировать методы обертки в тех связанных классах. В таких случаях, a Lookup
объект на C.E
было бы неспособно тем членам парламента, не занимающим официального поста. Обходное решение для этого ограничения Lookup.in
метод, который может преобразовать поиск на C.E
в одного на любом из тех других классов, без специального повышения полномочия.
Хотя инструкции байт-кода могут только обратиться к классам в связанном загрузчике класса, этот API может искать методы в любом классе пока ссылка на Class
объект доступен. Такие ссылки перекрестного загрузчика также возможны с Базовым API Reflection, и невозможны к инструкциям байт-кода такой как invokestatic
или getfield
. Есть API менеджера безопасности, чтобы позволить приложениям проверять такие ссылки перекрестного загрузчика. Эти проверки применяются к обоим MethodHandles.Lookup
API и Базовый API Reflection (как найдено на Class
).
Проверки прав доступа только применяются к именованным и отраженным методам, конструкторам, и полям. Другие методы создания дескриптора метода, такой как MethodHandle.asType
, не требуйте никаких проверок прав доступа, и делаются со статическими методами MethodHandles
, независимо от любого Lookup
объект.
SecurityException
. Определить smgr
как менеджер безопасности, refc
как содержание класса, в котором элемент разыскивается, и defc
как класс, в котором фактически определяется элемент. Вызовы выполняются согласно следующим правилам: smgr.checkMemberAccess(refc, Member.PUBLIC)
вызывается. refc
, тогда smgr.checkPackageAccess(refcPkg)
вызывается, где refcPkg
пакет refc
. smgr.checkMemberAccess(defc, Member.DECLARED)
вызывается. (Отметьте это defc
могло бы быть то же самое как refc
.) Реализация по умолчанию этого метода менеджера безопасности осматривает стек, чтобы определить исходную вызывающую сторону отражающего запроса (такой как findStatic
), и выполняет дополнительные проверки разрешения если загрузчик класса defc
отличается от загрузчика класса класса, из которого прибыл отражающий запрос. defc
и refc
находятся в различных загрузчиках класса, и если загрузчик класса класса поиска не является тем же самым как или предок загрузчика класса defc
, тогда smgr.checkPackageAccess(defcPkg)
вызывается, где defcPkg
пакет defc
. Модификатор и Тип | Поле и Описание |
---|---|
static int |
ПАКЕТ
Одно-разрядное представление маски
package доступ (доступ по умолчанию), который может способствовать результату lookupModes . |
static int |
ЧАСТНЫЙ
Одно-разрядное представление маски
private доступ, который может способствовать результату lookupModes . |
static int |
ЗАЩИЩЕННЫЙ
Одно-разрядное представление маски
protected доступ, который может способствовать результату lookupModes . |
static int |
ОБЩЕСТВЕННОСТЬ
Одно-разрядное представление маски
public доступ, который может способствовать результату lookupModes . |
Модификатор и Тип | Метод и Описание |
---|---|
MethodHandle |
bind(Object receiver, String name, MethodType type)
Производит ранне-ограниченный дескриптор метода для нестатического метода.
|
MethodHandle |
findConstructor(Class<?> refc, MethodType type)
Производит дескриптор метода, который создает объект и инициализирует его, используя конструктора указанного типа.
|
MethodHandle |
findGetter(Class<?> refc, String name, Class<?> type)
Производит дескриптор метода, дающий доступ для чтения к нестатическому полю.
|
MethodHandle |
findSetter(Class<?> refc, String name, Class<?> type)
Производит дескриптор метода, дающий доступ для записи к нестатическому полю.
|
MethodHandle |
findSpecial(Class<?> refc, String name, MethodType type, Class<?> specialCaller)
Производит ранне-ограниченный дескриптор метода для виртуального метода, как будто вызванный от
invokespecial инструкция от caller . |
MethodHandle |
findStatic(Class<?> refc, String name, MethodType type)
Производит дескриптор метода для статического метода.
|
MethodHandle |
findStaticGetter(Class<?> refc, String name, Class<?> type)
Производит дескриптор метода, дающий доступ для чтения к статическому полю.
|
MethodHandle |
findStaticSetter(Class<?> refc, String name, Class<?> type)
Производит дескриптор метода, дающий доступ для записи к статическому полю.
|
MethodHandle |
findVirtual(Class<?> refc, String name, MethodType type)
Производит дескриптор метода для виртуального метода.
|
MethodHandles. Поиск |
in(Class<?> requestedLookupClass)
Создает поиск на указанном новом классе поиска.
|
Class<?> |
lookupClass()
Говорит, какой класс выполняет поиск.
|
int |
lookupModes()
Говорит, какие классы защиты доступа элементов этот объект поиска может произвести.
|
Строка |
toString()
Выводит на экран имя класса, из которого должны быть сделаны поиски.
|
MethodHandle |
unreflect(Method m)
Делает дескриптор прямого метода к м., если у класса поиска есть разрешение.
|
MethodHandle |
unreflectConstructor(Constructor c)
Производит дескриптор метода для отраженного конструктора.
|
MethodHandle |
unreflectGetter(Field f)
Производит дескриптор метода, дающий доступ для чтения к отраженному полю.
|
MethodHandle |
unreflectSetter(Field f)
Производит дескриптор метода, дающий доступ для записи к отраженному полю.
|
MethodHandle |
unreflectSpecial(Method m, Class<?> specialCaller)
Производит дескриптор метода для отраженного метода.
|
public static final int PUBLIC
public
доступ, который может способствовать результату lookupModes
. Значение, 0x01
, оказывается, то же самое как значение public
бит модификатора.public static final int PRIVATE
private
доступ, который может способствовать результату lookupModes
. Значение, 0x02
, оказывается, то же самое как значение private
бит модификатора.public static final int PROTECTED
protected
доступ, который может способствовать результату lookupModes
. Значение, 0x04
, оказывается, то же самое как значение protected
бит модификатора.public static final int PACKAGE
package
доступ (доступ по умолчанию), который может способствовать результату lookupModes
. Значение 0x08
, который не соответствует обоснованно никакому определенному биту модификатора.public Class<?> lookupClass()
Класс подразумевает максимальный уровень права доступа, но полномочия могут быть дополнительно ограничены битовой маской lookupModes
, который управляет, можно ли к непубличным элементам получить доступ.
public int lookupModes()
У недавно создаваемого объекта поиска на классе вызывающей стороны есть весь возможный набор битов, так как класс вызывающей стороны может получить доступ ко всем своим собственным элементам. У объекта поиска на новом классе поиска, создаваемом из предыдущего объекта поиска, могут быть некоторые обнуленные биты режима. Цель этого состоит в том, чтобы ограничить доступ через новый объект поиска, так, чтобы это могло получить доступ только к именам, которые могут быть достигнуты исходным объектом поиска, и также новым классом поиска.
public MethodHandles.Lookup in(Class<?> requestedLookupClass)
lookupClass
. Однако, получающееся Lookup
у объекта, как гарантируют, больше не будет возможностей доступа чем оригинал. В частности возможности доступа могут быть потеряны следующим образом:
requestedLookupClass
- требуемый класс поиска для нового объекта поискаNullPointerException
- если параметром является нульpublic String toString()
Class.getName
.), Если есть ограничения на доступ, разрешенный к этому поиску, это обозначается, добавляя суффикс к имени класса, состоя из наклонной черты и ключевого слова. Ключевое слово представляет самый сильный предоставленный доступ, и выбирается следующим образом: MethodHandles.lookup
. Объекты, создаваемые Lookup.in
всегда имейте ограниченный доступ, и выведет на экран суффикс. (Может казаться странным, что защищенный доступ должен быть более сильным чем частный доступ. Просматриваемый независимо от доступа пакета, защищенный доступ является первым, чтобы быть потерянным, потому что это требует прямого отношения подкласса между вызывающей стороной и вызываемым.)
toString
в классе Object
in(java.lang.Class<?>)
public MethodHandle findStatic(Class<?> refc, String name, MethodType type) throws NoSuchMethodException, IllegalAccessException
findVirtual
или findSpecial
.) Метод и все его типы параметра должны быть доступными для класса поиска. Если класс метода еще не был инициализирован, который сразу делается, прежде, чем дескриптор метода возвращается. У возвращенного дескриптора метода будет переменная арность если и только если переменный бит модификатора арности метода (0x0080
) устанавливается.
refc
- класс, от которого получают доступ к методуname
- имя методаtype
- тип методаNoSuchMethodException
- если метод не существуетIllegalAccessException
- если проверка доступа перестала работать, или если метод не static
, или если переменный бит модификатора арности метода устанавливается и asVarargsCollector
сбоиSecurityException
- если менеджер безопасности присутствует и это отказывает в доступеNullPointerException
- если каким-либо параметром является нульpublic MethodHandle findVirtual(Class<?> refc, String name, MethodType type) throws NoSuchMethodException, IllegalAccessException
refc
) предварительно ожидаемый. Метод и все его типы параметра должны быть доступными для класса поиска. Когда вызвано, дескриптор обработает первый параметр как получатель и диспетчеризирует на типе получателя, чтобы определить который реализация метода войти. (Действие диспетчеризации идентично с выполняемым invokevirtual
или invokeinterface
инструкция.)
У возвращенного дескриптора метода будет переменная арность если и только если переменный бит модификатора арности метода (0x0080
) устанавливается.
Из-за общей эквивалентности между invokevirtual
инструкции и дескрипторы метода, произведенные findVirtual
, если класс MethodHandle
и строка имени invokeExact
или invoke
, получающийся дескриптор метода эквивалентен одному произведенному MethodHandles.exactInvoker
или MethodHandles.invoker
с тем же самым type
параметр.
refc
- класс или интерфейс, от которого получают доступ к методуname
- имя методаtype
- тип метода, с опущенным параметром получателяNoSuchMethodException
- если метод не существуетIllegalAccessException
- если проверка доступа перестала работать, или если метод static
или если переменный бит модификатора арности метода устанавливается и asVarargsCollector
сбоиSecurityException
- если менеджер безопасности присутствует и это отказывает в доступеNullPointerException
- если каким-либо параметром является нульpublic MethodHandle findConstructor(Class<?> refc, MethodType type) throws NoSuchMethodException, IllegalAccessException
Отметьте: У требуемого типа должен быть тип возврата void
. Это является непротиворечивым с обработкой JVM дескрипторов типа конструктора.
У возвращенного дескриптора метода будет переменная арность если и только если переменный бит модификатора арности конструктора (0x0080
) устанавливается.
refc
- класс или интерфейс, от которого получают доступ к методуtype
- тип метода, с параметром получателя, опущенным, и пустой тип возвратаNoSuchMethodException
- если конструктор не существуетIllegalAccessException
- если проверка доступа перестала работать или если переменный бит модификатора арности метода устанавливается и asVarargsCollector
сбоиSecurityException
- если менеджер безопасности присутствует и это отказывает в доступеNullPointerException
- если каким-либо параметром является нульpublic MethodHandle findSpecial(Class<?> refc, String name, MethodType type, Class<?> specialCaller) throws NoSuchMethodException, IllegalAccessException
invokespecial
инструкция от caller
. Тип дескриптора метода будет типом метода с соответственно ограниченным типом получателя (такой как caller
) предварительно ожидаемый. Метод и все его типы параметра должны быть доступными для вызывающей стороны. Когда вызвано, дескриптор обработает первый параметр как получатель, но не будет диспетчеризировать на типе получателя. (Это прямое действие вызова идентично с выполняемым invokespecial
инструкция.)
Если явно указанный класс вызывающей стороны не идентичен с классом поиска, или если у этого объекта поиска нет частных прав доступа, сбоев доступа.
У возвращенного дескриптора метода будет переменная арность если и только если переменный бит модификатора арности метода (0x0080
) устанавливается.
refc
- класс или интерфейс, от которого получают доступ к методуname
- имя метода (который не должен быть" <init>"),type
- тип метода, с опущенным параметром получателяspecialCaller
- предложенный класс вызова, чтобы выполнить invokespecial
NoSuchMethodException
- если метод не существуетIllegalAccessException
- если проверка доступа перестала работать или если переменный бит модификатора арности метода устанавливается и asVarargsCollector
сбоиSecurityException
- если менеджер безопасности присутствует и это отказывает в доступеNullPointerException
- если каким-либо параметром является нульpublic MethodHandle findGetter(Class<?> refc, String name, Class<?> type) throws NoSuchFieldException, IllegalAccessException
refc
- класс или интерфейс, от которого получают доступ к методуname
- имя поляtype
- тип поляNoSuchFieldException
- если поле не существуетIllegalAccessException
- если проверка доступа перестала работать, или если поле static
SecurityException
- если менеджер безопасности присутствует и это отказывает в доступеNullPointerException
- если каким-либо параметром является нульpublic MethodHandle findSetter(Class<?> refc, String name, Class<?> type) throws NoSuchFieldException, IllegalAccessException
refc
- класс или интерфейс, от которого получают доступ к методуname
- имя поляtype
- тип поляNoSuchFieldException
- если поле не существуетIllegalAccessException
- если проверка доступа перестала работать, или если поле static
SecurityException
- если менеджер безопасности присутствует и это отказывает в доступеNullPointerException
- если каким-либо параметром является нульpublic MethodHandle findStaticGetter(Class<?> refc, String name, Class<?> type) throws NoSuchFieldException, IllegalAccessException
refc
- класс или интерфейс, от которого получают доступ к методуname
- имя поляtype
- тип поляNoSuchFieldException
- если поле не существуетIllegalAccessException
- если проверка доступа перестала работать, или если поле не static
SecurityException
- если менеджер безопасности присутствует и это отказывает в доступеNullPointerException
- если каким-либо параметром является нульpublic MethodHandle findStaticSetter(Class<?> refc, String name, Class<?> type) throws NoSuchFieldException, IllegalAccessException
refc
- класс или интерфейс, от которого получают доступ к методуname
- имя поляtype
- тип поляNoSuchFieldException
- если поле не существуетIllegalAccessException
- если проверка доступа перестала работать, или если поле не static
SecurityException
- если менеджер безопасности присутствует и это отказывает в доступеNullPointerException
- если каким-либо параметром является нульpublic MethodHandle bind(Object receiver, String name, MethodType type) throws NoSuchMethodException, IllegalAccessException
defc
в котором метод имени и типа доступен для класса поиска. Метод и все его типы параметра должны быть доступными для класса поиска. Тип дескриптора метода будет типом метода без любой вставки дополнительного параметра получателя. Данный получатель будет связан в дескриптор метода, так, чтобы каждый звонок в дескриптор метода вызвал требуемый метод на данный получатель. У возвращенного дескриптора метода будет переменная арность если и только если переменный бит модификатора арности метода (0x0080
) устанавливается и запаздывающим параметром массива не является единственный параметр. (Если запаздывающим параметром массива будет единственный параметр, то данное значение получателя будет связано с этим.)
Это эквивалентно следующему коду:
гдеimport static java.lang.invoke.MethodHandles.*; import static java.lang.invoke.MethodType.*; ... MethodHandle mh0 = lookup().findVirtual
(defc, name, type); MethodHandle mh1 = mh0.bindTo
(receiver); MethodType mt1 = mh1.type(); if (mh0.isVarargsCollector()) mh1 = mh1.asVarargsCollector(mt1.parameterType(mt1.parameterCount()-1)); return mh1;
defc
также receiver.getClass()
или тип высшего качества того класса, в котором требуемый метод доступен для класса поиска. (Отметьте это bindTo
не сохраняет переменную арность.)receiver
- объект, от которого получают доступ к методуname
- имя методаtype
- тип метода, с опущенным параметром получателяNoSuchMethodException
- если метод не существуетIllegalAccessException
- если проверка доступа перестала работать или если переменный бит модификатора арности метода устанавливается и asVarargsCollector
сбоиSecurityException
- если менеджер безопасности присутствует и это отказывает в доступеNullPointerException
- если каким-либо параметром является нульpublic MethodHandle unreflect(Method m) throws IllegalAccessException
accessible
флаг не устанавливается, проверка доступа сразу выполняется от имени класса поиска. Если м. не общедоступен, не совместно используйте получающийся дескриптор с недоверяемыми сторонами. У возвращенного дескриптора метода будет переменная арность если и только если переменный бит модификатора арности метода (0x0080
) устанавливается.
m
- отраженный методIllegalAccessException
- если проверка доступа перестала работать или если переменный бит модификатора арности метода устанавливается и asVarargsCollector
сбоиNullPointerException
- если параметром является нульpublic MethodHandle unreflectSpecial(Method m, Class<?> specialCaller) throws IllegalAccessException
invokespecial
инструкция изнутри specialCaller
. Тип дескриптора метода будет типом метода со специальным предварительно ожидаемым типом вызывающей стороны (а не получатель метода). Если метод accessible
флаг не устанавливается, проверка доступа сразу выполняется от имени класса поиска, как будто invokespecial
инструкция соединялась. У возвращенного дескриптора метода будет переменная арность если и только если переменный бит модификатора арности метода (0x0080
) устанавливается.
m
- отраженный методspecialCaller
- класс, номинально вызывая методIllegalAccessException
- если проверка доступа перестала работать или если переменный бит модификатора арности метода устанавливается и asVarargsCollector
сбоиNullPointerException
- если каким-либо параметром является нульpublic MethodHandle unreflectConstructor(Constructor c) throws IllegalAccessException
newInstance
работа, создавая новый экземпляр класса конструктора на параметрах, которые передают к дескриптору метода. Если конструктор accessible
флаг не устанавливается, проверка доступа сразу выполняется от имени класса поиска.
У возвращенного дескриптора метода будет переменная арность если и только если переменный бит модификатора арности конструктора (0x0080
) устанавливается.
c
- отраженный конструкторIllegalAccessException
- если проверка доступа перестала работать или если переменный бит модификатора арности метода устанавливается и asVarargsCollector
сбоиNullPointerException
- если параметром является нульpublic MethodHandle unreflectGetter(Field f) throws IllegalAccessException
accessible
флаг не устанавливается, проверка доступа сразу выполняется от имени класса поиска.f
- отраженное полеIllegalAccessException
- если проверка доступа перестала работатьNullPointerException
- если параметром является нульpublic MethodHandle unreflectSetter(Field f) throws IllegalAccessException
accessible
флаг не устанавливается, проверка доступа сразу выполняется от имени класса поиска.f
- отраженное полеIllegalAccessException
- если проверка доступа перестала работатьNullPointerException
- если параметром является нуль
Для дальнейшей ссылки API и документации разработчика, см.
Авторское право © 1993, 2011, Oracle и/или его филиалы. Все права защищены.