Класс AccessibleObject
- Все реализованные интерфейсы:
AnnotatedElement
- Прямые известные подклассы:
-
Executable,Field
public class AccessibleObject extends Object implements AnnotatedElement
AccessibleObject — базовый класс для объектов Field, Method и Constructor (известных как отражённые объекты). Он предоставляет возможность помечать отражённый объект как подавляющий проверки контроля доступа к языку Java, когда он используется. Это позволяет сложным приложениям с достаточными привилегиями, таким как сериализация объектов Java или другие механизмы сохранения, манипулировать объектами таким образом, который обычно запрещён. Контроль доступа к языку Java предотвращает использование частных членов за пределами их класса верхнего уровня; членов с доступом по пакету за пределами их пакета; защищённых членов за пределами их пакета или подклассов; и общедоступных членов за пределами их модуля, если они не объявлены в пакете exported и пользователь reads их модуль. По умолчанию контроль доступа к языку Java применяется (с одной вариацией) при использовании Field, Method или Constructor для получения или установки полей, вызова методов или создания и инициализации новых экземпляров классов соответственно. Каждый отражённый объект проверяет, находится ли использующий его код в соответствующем классе, пакете или модуле. Проверка, вызываемая кодом JNI без класса Java в стеке, успешна только если член и класс объявления являются общедоступными, и класс находится в пакете, экспортированном во все модули.
Единственное отличие от контроля доступа к языку Java заключается в том, что проверки отражёнными объектами предполагают возможность чтения. То есть, предполагается, что модуль, содержащий использование отражённого объекта, имеет право читать модуль, в котором объявлены базовое поле, метод или конструктор.
Возможность подавления проверок контроля доступа к языку Java (и, следовательно, включения доступа) зависит от того, соответствует ли отражённый объект члену в экспортированном или открытом пакете (см. setAccessible(boolean)).
- См. Спецификацию языка Java:
- 6.6 Контроль доступа
- С:
- 1.2
- Внешние спецификации
Краткое описание конструкторов
| Модификатор | Конструктор | Описание |
|---|---|---|
protected |
Устарело. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
final boolean |
canAccess |
Проверка возможности доступа к этому отражённому объекту вызывающим кодом. |
<T extends Annotation> |
getAnnotation |
Возвращает аннотацию этого элемента для указанного типа, если такая аннотация присутствует, иначе null. |
Annotation[] |
getAnnotations() |
Возвращает аннотации, которые присутствуют на этом элементе. |
<T extends Annotation> |
getAnnotationsByType |
Возвращает аннотации, которые связаны с этим элементом. |
<T extends Annotation> |
getDeclaredAnnotation |
Возвращает аннотацию этого элемента для указанного типа, если такая аннотация непосредственно присутствует, иначе null. |
Annotation[] |
getDeclaredAnnotations() |
Возвращает аннотации, которые непосредственно присутствуют на этом элементе. |
<T extends Annotation> |
getDeclaredAnnotationsByType |
Возвращает аннотацию(и) этого элемента для указанного типа, если такие аннотации непосредственно присутствуют или косвенно присутствуют. |
boolean |
isAccessible() |
Устарело. Этот метод устарел, так как его имя предполагает проверку доступности отражённого объекта, когда на самом деле он указывает, подавлены ли проверки контроля доступа к языку Java. |
boolean |
isAnnotationPresent |
Возвращает true, если аннотация указанного типа присутствует на этом элементе, иначе false. |
void |
setAccessible |
Устанавливает флаг accessible для этого отражённого объекта на указанное значение boolean. |
static void |
setAccessible |
Удобный метод для установки флага accessible для массива отражённых объектов. |
final boolean |
trySetAccessible() |
Устанавливает флаг accessible для этого отражённого объекта на значение true, если это возможно. |
Подробное описание конструкторов
AccessibleObject
@Deprecated(since="17") protected AccessibleObject()
Подробное описание методов
setAccessible
public static void setAccessible(AccessibleObject[] array, boolean flag)
accessible для массива отраженных объектов. Этот метод можно использовать для включения доступа ко всем отраженным объектам в массиве, когда доступ к каждому отраженному объекту может быть включен, как указано в setAccessible(boolean).
Исключение SecurityException будет брошено, если любой из элементов входного array является объектом Constructor для класса java.lang.Class и flag равно true.
- Параметры:
-
array- массив AccessibleObjects -
flag- новое значение флагаaccessibleв каждом объекте - Исключения:
-
InaccessibleObjectException- если доступ нельзя включить для всех объектов в массиве -
SecurityException- если элемент в массиве является конструктором дляjava.lang.Class
setAccessible
public void setAccessible(boolean flag)
accessible для этого отраженного объекта на указанное булево значение. Значение true указывает, что отраженный объект должен игнорировать проверки контроля доступа языка Java при его использовании. Значение false указывает, что отраженный объект должен применять проверки контроля доступа языка Java при его использовании, с вариантами, отмеченными в описании класса. Этот метод может быть использован вызывающим классом C для включения доступа к member объекта declaring class D, если выполняются следующие условия:
-
CиDнаходятся в одном модуле. - Член является
public, иDравенpublicв пакете, к которому модуль, содержащийD,exportsкак минимум к модулю, содержащемуC. - Член является
protected,static,Dравенpublicв пакете, к которому модуль, содержащийD, экспортирует как минимум к модулю, содержащемуC, иCявляется подклассомD. -
Dнаходится в пакете, к которому модуль, содержащийDopensкак минимум к модулю, содержащемуC. Все пакеты в безымянных и открытых модулях открыты для всех модулей, поэтому этот метод всегда выполняется успешно, когдаDнаходится в безымянном или открытом модуле.
Этот метод может использоваться кодом JNI без вызывающего класса в стеке для включения доступа к member объекта declaring class D, если и только если:
- Член является
public, иDравенpublicв пакете, к которому модуль, содержащийDexportsбезусловно.
Этот метод не может использоваться для включения доступа к закрытым членам, членам с доступом по умолчанию (пакетному), защищенным экземплярам членов или защищенным конструкторам, когда класс объявления находится в другом модуле, кроме вызывающего, и пакет, содержащий класс объявления, не открыт для модуля вызывающего.
Флаг accessible, когда true, подавляет проверки контроля доступа языка Java, чтобы только включить чтение доступ к этим неизменяемым конечным полям.
- Параметры:
-
flag- новое значение флагаaccessible - Исключения:
-
InaccessibleObjectException- если доступ нельзя включить - Внешние спецификации
- См. также:
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
...
}
Если этот метод вызывается кодом JNI без вызывающего класса в стеке, флаг accessible может быть установлен только если член и класс объявления являются общедоступными, и класс находится в пакете, который экспортируется безусловно.
- Возвращает:
-
true, если флагaccessibleустановлен вtrue;falseесли доступ нельзя включить. - С:
- 9
- Внешние спецификации
- См. также:
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, с учетом изменений, указанных в описании класса. Если этот метод вызывается кодом JNI без класса вызывающего кода в стеке, этот метод возвращает true, если член и класс объявления являются общедоступными, а класс находится в пакете, который экспортирован безусловно.
- Parameters:
-
obj- объект-экземпляр класса объявления этого отраженного объекта, если это метод или поле экземпляра - Returns:
-
true, если вызывающий код может получить доступ к этому отраженному объекту. - Throws:
-
IllegalArgumentException-- если этот отраженный объект является статическим членом или конструктором, и заданный
objне являетсяnull, или - если этот отраженный объект является методом или полем экземпляра, и заданный
objявляетсяnullили имеет тип, который не является подклассомdeclaring classчлена.
- если этот отраженный объект является статическим членом или конструктором, и заданный
- См. Спецификацию языка Java:
- 6.6 Управление доступом
- Since:
- 9
- Внешние спецификации
- См. также:
getAnnotation
public <T extends Annotation> T getAnnotation(Class<T> annotationClass)
Обратите внимание, что любая аннотация, возвращаемая этим методом, является аннотацией объявления.
- Specified by:
-
getAnnotationв интерфейсеAnnotatedElement - Требования к реализации:
- Стандартная реализация выбрасывает
UnsupportedOperationException; подклассы должны переопределять этот метод. - Параметры типа:
T- тип аннотации, для которого выполняется запрос и возвращается, если она присутствует- Parameters:
-
annotationClass- объект Class, соответствующий типу аннотации - Returns:
- аннотация этого элемента для указанного типа аннотации, если она присутствует на этом элементе, иначе null
- Throws:
-
NullPointerException- если предоставленный класс аннотации равен null - Since:
- 1.5
isAnnotationPresent
public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)
Логическое значение, возвращаемое этим методом, эквивалентно: getAnnotation(annotationClass) != null
- Specified by:
-
isAnnotationPresentв интерфейсеAnnotatedElement - Parameters:
-
annotationClass- объект Class, соответствующий типу аннотации - Returns:
- true, если аннотация для указанного типа аннотации присутствует на этом элементе, иначе false
- Throws:
-
NullPointerException- если предоставленный класс аннотации равен null - Since:
- 1.5
getAnnotationsByType
public <T extends Annotation> T[] getAnnotationsByType(Class<T> annotationClass)
AnnotatedElement.getAnnotation(Class) заключается в том, что этот метод определяет, является ли его аргумент повторяемым типом аннотации (JLS 9.6), и, если да, пытается найти одну или несколько аннотаций этого типа, "просмотрев" контейнерную аннотацию. Вызывающий метод может свободно изменять возвращаемый массив; это не повлияет на массивы, возвращаемые другим вызывающим методам. Обратите внимание, что любые аннотации, возвращаемые этим методом, являются аннотациями объявления.
- Specified by:
-
getAnnotationsByTypeв интерфейсеAnnotatedElement - Требования к реализации:
- Стандартная реализация выбрасывает
UnsupportedOperationException; подклассы должны переопределять этот метод. - Параметры типа:
T- тип аннотации, для которого выполняется запрос и возвращается, если она присутствует- Parameters:
-
annotationClass- объект Class, соответствующий типу аннотации - Returns:
- все аннотации этого элемента для указанного типа аннотации, если они связаны с этим элементом, иначе массив длиной ноль
- Throws:
-
NullPointerException- если предоставленный класс аннотации равен null - Since:
- 1.8
getAnnotations
public Annotation[] getAnnotations()
Обратите внимание, что любые аннотации, возвращаемые этим методом, являются аннотациями объявления.
- Specified by:
-
getAnnotationsв интерфейсеAnnotatedElement - Returns:
- аннотации, присутствующие на этом элементе
- Since:
- 1.5
getDeclaredAnnotation
public <T extends Annotation> T getDeclaredAnnotation(Class<T> annotationClass)
Обратите внимание, что любая аннотация, возвращаемая этим методом, является аннотацией объявления.
- Specified by:
-
getDeclaredAnnotationв интерфейсеAnnotatedElement - Параметры типа:
T- тип аннотации, для которого выполняется запрос и возвращается, если она непосредственно присутствует- Parameters:
-
annotationClass- объект Class, соответствующий типу аннотации - Returns:
- аннотация этого элемента для указанного типа аннотации, если она непосредственно присутствует на этом элементе, иначе null
- Throws:
-
NullPointerException- если предоставленный класс аннотации равен null - Since:
- 1.8
getDeclaredAnnotationsByType
public <T extends Annotation> T[] getDeclaredAnnotationsByType(Class<T> annotationClass)
AnnotatedElement.getDeclaredAnnotation(Class) заключается в том, что этот метод определяет, является ли его аргумент повторяемым типом аннотации (JLS 9.6), и, если да, пытается найти одну или несколько аннотаций этого типа, "просмотрев" контейнерную аннотацию, если она присутствует. Вызывающий метод может свободно изменять возвращаемый массив; это не повлияет на массивы, возвращаемые другим вызывающим методам. Обратите внимание, что любые аннотации, возвращаемые этим методом, являются аннотациями объявления.
- Specified by:
-
getDeclaredAnnotationsByTypeв интерфейсеAnnotatedElement - Параметры типа:
T- тип аннотации, для которого выполняется запрос и возвращается, если она непосредственно или косвенно присутствует- Parameters:
-
annotationClass- объект Class, соответствующий типу аннотации - Returns:
- все аннотации этого элемента для указанного типа аннотации, если они непосредственно или косвенно присутствуют на этом элементе, иначе массив длиной ноль
- Throws:
-
NullPointerException- если предоставленный класс аннотации равен null - Since:
- 1.8
getDeclaredAnnotations
public Annotation[] getDeclaredAnnotations()
Обратите внимание, что любые аннотации, возвращаемые этим методом, являются аннотациями объявления.
- Указано в:
-
getDeclaredAnnotationsв интерфейсеAnnotatedElement - Требования к реализации:
- По умолчанию реализация выбрасывает
UnsupportedOperationException; подклассы должны переопределять этот метод. - Возвращает:
- аннотации, непосредственно присутствующие на этом элементе
- С тех пор:
- 1.5
© 1993, 2025, 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://download.java.net/java/early_access/jdk24/docs/api/java.base/java/lang/reflect/AccessibleObject.html