Класс AccessibleObject
- java.lang.Object
-
- java.lang.reflect.AccessibleObject
- Все реализованные интерфейсы:
AnnotatedElement
- Прямые известные подклассы:
-
Executable,Field
public class AccessibleObject extends Object implements AnnotatedElement
Класс AccessibleObject является базовым классом для объектов Field, Method, и Constructor (известных как отражённые объекты). Он предоставляет возможность помечать отражённый объект как подавляющий проверки контроля доступа языка Java при его использовании. Это позволяет сложным приложениям с достаточными привилегиями, таким как сериализация объектов Java или другие механизмы сохранения, манипулировать объектами таким образом, как это обычно запрещено.
Контроль доступа языка Java запрещает использование приватных членов за пределами своего верхнего уровня класса; членов с доступом по пакету за пределами своего пакета; защищённых членов за пределами своего пакета или подклассов; и публичных членов за пределами своего модуля, если они не объявлены в пакете exported и пользователь reads свой модуль. По умолчанию, контроль доступа языка Java применяется (с одной вариацией) при использовании Field, Method или Constructor для получения или установки полей, вызова методов или создания и инициализации новых экземпляров классов соответственно. Каждый отражённый объект проверяет, что код, использующий его, находится в соответствующем классе, пакете или модуле.
Единственное изменение в контроле доступа языка Java заключается в том, что проверки отражёнными объектами предполагают возможность чтения. То есть, модуль, содержащий использование отражённого объекта, предполагается читающим модуль, в котором объявлено базовое поле, метод или конструктор.
Возможно ли подавить проверки контроля доступа языка Java (и, таким образом, включить доступ) зависит от того, соответствует ли отражённый объект члену в экспортированном или открытом пакете (см. setAccessible(boolean)).
- С момента:
- 1.2
Конструкторы
| Модификатор | Конструктор | Описание |
|---|---|---|
protected | AccessibleObject() | Конструктор: используется только виртуальной машиной Java. |
Методы
| Модификатор и тип | Метод | Описание |
|---|---|---|
boolean | canAccess(Object obj) | Проверка, может ли вызывающий объект получить доступ к этому отражённому объекту. |
<T extends Annotation> | getAnnotation(Class<T> annotationClass) | Возвращает аннотацию этого элемента для указанного типа, если такая аннотация присутствует, иначе null. |
Annotation[] | getAnnotations() | Возвращает аннотации, которые присутствуют на этом элементе. |
<T extends Annotation> | getAnnotationsByType(Class<T> annotationClass) | Возвращает аннотации, которые связаны с этим элементом. |
<T extends Annotation> | getDeclaredAnnotation(Class<T> annotationClass) | Возвращает аннотацию этого элемента для указанного типа, если такая аннотация непосредственно присутствует, иначе null. |
Annotation[] | getDeclaredAnnotations() | Возвращает аннотации, которые непосредственно присутствуют на этом элементе. |
<T extends Annotation> | getDeclaredAnnotationsByType(Class<T> annotationClass) | Возвращает аннотацию(и) этого элемента для указанного типа, если такие аннотации непосредственно присутствуют или косвенно присутствуют. |
boolean | isAccessible() | Устаревший. Этот метод устарел, так как его имя намекает на проверку доступности отражённого объекта, когда он фактически указывает, подавлены ли проверки контроля доступа языка Java. |
boolean | isAnnotationPresent(Class<? extends Annotation> annotationClass) | Возвращает true, если аннотация для указанного типа присутствует на этом элементе, иначе false. |
void | setAccessible(boolean flag) | Устанавливает флаг |
static void | setAccessible(AccessibleObject[] array,
boolean flag) | Удобный метод для установки флага |
boolean | trySetAccessible() | Устанавливает флаг |
Методы, объявленные в классе java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait Конструкторы
AccessibleObject
protected AccessibleObject()
Конструктор: используется только виртуальной машиной Java.
Методы
setAccessible
public static void setAccessible(AccessibleObject[] array,
boolean flag) Удобный метод для установки флага accessible для массива отраженных объектов с одной проверкой безопасности (для повышения эффективности).
Этот метод может быть использован для включения доступа ко всем отраженным объектам в массиве, когда доступ к каждому отраженному объекту может быть включен, как указано в setAccessible(boolean).
Если есть менеджер безопасности, его метод checkPermission сначала вызывается с разрешением ReflectPermission("suppressAccessChecks").
Исключение SecurityException также выбрасывается, если любой из элементов входного array является объектом Constructor для класса java.lang.Class и flag равно true.
- Параметры:
-
array- массив AccessibleObjects -
flag- новое значение флагаaccessibleв каждом объекте - Исключения:
-
InaccessibleObjectException- если доступ не может быть включен для всех объектов в массиве -
SecurityException- если запрос отклонен менеджером безопасности или элемент в массиве является конструктором дляjava.lang.Class - См. также:
-
SecurityManager.checkPermission(java.security.Permission),ReflectPermission
setAccessible
public void setAccessible(boolean flag)
Установить флаг accessible для этого отраженного объекта на указанное значение boolean. Значение true указывает, что отраженный объект должен подавлять проверки контроля доступа языка Java при использовании. Значение false указывает, что отраженный объект должен применять проверки контроля доступа языка Java при использовании, с вариацией, указанной в описании класса.
Этот метод может быть использован вызывающим объектом в классе C для включения доступа к member элемента declaring class D если выполняются следующие условия:
-
CиDнаходятся в одном модуле. - Элемент является
publicиDравенpublicв пакете, к которому модуль, содержащийDexportsпо крайней мере модулю, содержащемуC. - Элемент является
protectedstatic,Dравенpublicв пакете, который модуль, содержащийDэкспортирует по крайней мере модулю, содержащемуC, иCявляется подклассомD. -
Dнаходится в пакете, который модуль, содержащийDopensпо крайней мере модулю, содержащемуC. Все пакеты в безымянных и открытых модулях открыты для всех модулей, поэтому этот метод всегда выполняется успешно, когдаDнаходится в безымянном или открытом модуле.
Этот метод не может быть использован для включения доступа к приватным членам, членам с доступом по умолчанию (пакетному), защищенным членам экземпляров или защищенным конструкторам, когда класс объявления находится в другом модуле по сравнению с вызывающим объектом и пакет, содержащий класс объявления, не открыт для модуля вызывающего объекта.
Если есть менеджер безопасности, его метод checkPermission сначала вызывается с разрешением ReflectPermission("suppressAccessChecks").
- Параметры:
-
flag- новое значение для флагаaccessible - Исключения:
-
InaccessibleObjectException- если доступ не может быть включен -
SecurityException- если запрос отклонен менеджером безопасности - См. также:
-
trySetAccessible(),MethodHandles.privateLookupIn(java.lang.Class<?>, java.lang.invoke.MethodHandles.Lookup)
trySetAccessible
public final boolean trySetAccessible()
Установить флаг accessible для этого отраженного объекта в значение true если это возможно. Этот метод устанавливает флаг accessible, как если бы был вызван setAccessible(true), и возвращает возможно обновлённое значение для флага accessible. Если доступ не может быть включен, т.е. проверки или контроль доступа языка Java не могут быть подавлены, этот метод возвращает false (в отличие от
setAccessible(true) выбрасывания InaccessibleObjectException при ошибке).
Этот метод является пустой операцией, если флаг accessible для этого отраженного объекта равен true.
Например, вызывающий объект может вызвать trySetAccessible на объекте Method для приватного метода экземпляра p.T::privateMethod чтобы подавить проверки контроля доступа языка Java, когда Method вызывается. Если класс p.T находится в другом модуле по сравнению с вызывающим объектом, и пакет p открыт для по крайней мере модуля вызывающего объекта, код ниже успешно устанавливает флаг accessible в true.
p.T obj = ....; // instance of p.T
:
Method m = p.T.class.getDeclaredMethod("privateMethod");
if (m.trySetAccessible()) {
m.invoke(obj);
} else {
// package p is not opened to the caller to access private member of T
...
} Если есть менеджер безопасности, его метод checkPermission сначала вызывается с разрешением ReflectPermission("suppressAccessChecks").
- Возвращает:
-
trueесли флагaccessibleустановлен вtrue;falseесли доступ не может быть включен. - Исключения:
-
SecurityException- если запрос отклонен менеджером безопасности - С:
- 9
- См. также:
MethodHandles.privateLookupIn(java.lang.Class<?>, java.lang.invoke.MethodHandles.Lookup)
isAccessible
@Deprecated(since="9") public boolean isAccessible()
false для отраженного объекта, который доступен для вызывающего объекта. Чтобы проверить, доступен ли этот отраженный объект, следует использовать canAccess(Object).Получить значение флага accessible для этого отраженного объекта.
- Возвращает:
- значение флага
accessibleобъекта
canAccess
public final boolean canAccess(Object obj)
Проверить, может ли вызывающий объект получить доступ к этому отраженному объекту. Если этот отраженный объект соответствует методу или полю экземпляра, то этот метод проверяет, может ли вызывающий объект получить доступ к данному obj с отраженным объектом. Для методов или полей экземпляров аргумент obj должен быть экземпляром declaring class. Для статических членов и конструкторов obj должен быть null.
Этот метод возвращает true если флаг accessible установлен в true, т.е. проверки контроля доступа языка Java подавлены, или если вызывающий объект может получить доступ к члену, как указано в Спецификации языка Java™, с вариациями, указанными в описании класса.
- Параметры:
-
obj- объект экземпляра класса объявления этого отраженного объекта, если это метод или поле экземпляра - Возвращает:
-
trueесли вызывающий объект может получить доступ к этому отраженному объекту. - Исключения:
-
IllegalArgumentException-- если этот отраженный объект является статическим членом или конструктором и данный
objнеnull, или - если этот отраженный объект является методом или полем экземпляра и данный
objявляетсяnullили типа, который не является подклассомdeclaring classчлена.
- если этот отраженный объект является статическим членом или конструктором и данный
- С:
- 9
- См. также:
-
trySetAccessible(),setAccessible(boolean)
getAnnotation
public <T extends Annotation> T getAnnotation(Class<T> annotationClass)
Описание скопировано из интерфейса: AnnotatedElement
Возвращает аннотацию этого элемента для указанного типа, если такая аннотация присутствует, в противном случае null.
- Определено в:
-
getAnnotationв интерфейсеAnnotatedElement - Параметры типа:
-
T- тип аннотации, запрос на которую и возвращение, если она присутствует - Параметры:
-
annotationClass- объект Class, соответствующий типу аннотации - Возвращает:
- аннотация этого элемента для указанного типа аннотации, если она присутствует на этом элементе, в противном случае null
- Исключения:
-
NullPointerException- если заданный класс аннотации равен null - С:
- 1.5
isAnnotationPresent
public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)
Возвращает true, если аннотация указанного типа присутствует на этом элементе, иначе false. Этот метод разработан в первую очередь для удобного доступа к аннотациям-маркерам.
Логическое значение, возвращаемое этим методом, эквивалентно: getAnnotation(annotationClass) != null
Тело метода по умолчанию указано как код выше.
- Определено в:
-
isAnnotationPresentв интерфейсеAnnotatedElement - Параметры:
-
annotationClass- объект Class, соответствующий типу аннотации - Возвращает:
- true, если аннотация указанного типа аннотации присутствует на этом элементе, иначе false
- Исключения:
-
NullPointerException- если заданный класс аннотации равен null - С:
- 1.5
getAnnotationsByType
public <T extends Annotation> T[] getAnnotationsByType(Class<T> annotationClass)
Описание скопировано из интерфейса: AnnotatedElement
Возвращает аннотации, связанные с этим элементом. Если аннотаций связанных с этим элементом нет, возвращаемое значение — массив длины 0. Различие между этим методом и AnnotatedElement.getAnnotation(Class) заключается в том, что этот метод определяет, является ли его аргумент повторяемым типом аннотации (JLS 9.6), и, если да, то пытается найти одну или несколько аннотаций этого типа, «просматривая» контейнерную аннотацию. Вызывающий объект этого метода свободен изменять возвращаемый массив; это не повлияет на массивы, возвращаемые другим вызывающим объектам.
- Указано в:
-
getAnnotationsByTypeв интерфейсеAnnotatedElement - Параметры типа:
-
T- тип аннотации, которую нужно запросить и вернуть, если она присутствует - Параметры:
-
annotationClass- объект Class, соответствующий типу аннотации - Возвращает:
- все аннотации этого элемента для указанного типа аннотации, если они связаны с этим элементом, иначе массив длиной ноль
- Издает:
-
NullPointerException- если заданный класс аннотации равен null - С:
- 1.8
getAnnotations
public Annotation[] getAnnotations()
Описание скопировано из интерфейса: AnnotatedElement
Возвращает аннотации, которые присутствуют на этом элементе. Если на этом элементе нет аннотаций, то значение возврата — массив длины 0. Вызывающий метод свободен изменять возвращаемый массив; это не повлияет на массивы, возвращаемые другим вызывающим сторонам.
- Указано в:
-
getAnnotationsв интерфейсеAnnotatedElement - Возвращает:
- аннотации, присутствующие на этом элементе
- С:
- 1.5
getDeclaredAnnotation
public <T extends Annotation> T getDeclaredAnnotation(Class<T> annotationClass)
Описание скопировано из интерфейса: AnnotatedElement
Возвращает аннотацию этого элемента для указанного типа, если такая аннотация непосредственно присутствует, иначе null. Этот метод игнорирует унаследованные аннотации. (Возвращает null, если аннотации непосредственно не присутствуют на этом элементе.)
- Указано в:
-
getDeclaredAnnotationв интерфейсеAnnotatedElement - Параметры типа:
-
T- тип аннотации, которую нужно запросить и вернуть, если она непосредственно присутствует - Параметры:
-
annotationClass- объект Class, соответствующий типу аннотации - Возвращает:
- аннотацию этого элемента для указанного типа аннотации, если она непосредственно присутствует на этом элементе, иначе null
- Издает:
-
NullPointerException- если заданный класс аннотации равен null - С:
- 1.8
getDeclaredAnnotationsByType
public <T extends Annotation> T[] getDeclaredAnnotationsByType(Class<T> annotationClass)
Описание скопировано из интерфейса: AnnotatedElement
Возвращает аннотацию(и) этого элемента для указанного типа, если такие аннотации непосредственно присутствуют или косвенно присутствуют. Этот метод игнорирует унаследованные аннотации. Если указанных аннотаций непосредственно или косвенно нет на этом элементе, то значение возврата — массив длины 0. Разница между этим методом и AnnotatedElement.getDeclaredAnnotation(Class) заключается в том, что этот метод определяет, является ли его аргумент повторяющимся типом аннотации (JLS 9.6), и в случае положительного ответа пытается найти одну или несколько аннотаций этого типа, «просматривая» контейнерную аннотацию, если она присутствует. Вызывающий метод свободен изменять возвращаемый массив; это не повлияет на массивы, возвращаемые другим вызывающим сторонам.
- Указано в:
-
getDeclaredAnnotationsByTypeв интерфейсеAnnotatedElement - Параметры типа:
-
T- тип аннотации, которую нужно запросить и вернуть, если она непосредственно или косвенно присутствует - Параметры:
-
annotationClass- объект Class, соответствующий типу аннотации - Возвращает:
- все аннотации этого элемента для указанного типа аннотации, если они непосредственно или косвенно присутствуют на этом элементе, иначе массив длиной ноль
- Издает:
-
NullPointerException- если заданный класс аннотации равен null - С:
- 1.8
getDeclaredAnnotations
public Annotation[] getDeclaredAnnotations()
Описание скопировано из интерфейса: AnnotatedElement
Возвращает аннотации, которые непосредственно присутствуют на этом элементе. Этот метод игнорирует унаследованные аннотации. Если на этом элементе нет аннотаций, то значение возврата — массив длины 0. Вызывающий метод свободен изменять возвращаемый массив; это не повлияет на массивы, возвращаемые другим вызывающим сторонам.
- Указано в:
-
getDeclaredAnnotationsв интерфейсеAnnotatedElement - Возвращает:
- аннотации, непосредственно присутствующие на этом элементе
- С:
- 1.5
© 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/reflect/AccessibleObject.html