Класс 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 этого отражённого объекта в указанное логическое значение. |
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).
Если любой элемент входного массива array является объектом Constructor для класса java.lang.Class и flag имеет значение true, возникает исключение SecurityException.
- Параметры:
-
array— массив AccessibleObjects -
flag— новое значение флагаaccessibleдля каждого объекта - Исключения:
-
InaccessibleObjectException— если нельзя включить доступ ко всем объектам массива -
SecurityException— если элемент массива является конструктором дляjava.lang.Class
setAccessible
public void setAccessible(boolean flag)
accessible этого отражённого объекта в указанное логическое значение. Значение true означает, что при использовании отражённый объект должен отключать проверки управления доступом языка Java. Значение false означает, что при использовании отражённый объект должен обеспечивать проверки управления доступом языка Java с учётом исключения, отмеченного в описании класса. Этот метод может использоваться вызывающим кодом в классе C для включения доступа к D member класса declaring class, если выполняется одно из следующих условий:
-
CиDнаходятся в одном модуле. - Элемент является
public, аDявляетсяpublicв пакете, который модуль, содержащийD,exportsкак минимум модулю, содержащемуC. - Элемент является
protectedstatic,Dявляетсяpublicв пакете, который модуль, содержащийD, экспортирует как минимум модулю, содержащемуC, аCявляется подклассомD. -
Dнаходится в пакете, который модуль, содержащийD,opensкак минимум модулю, содержащемуC. Все пакеты в безымянных и открытых модулях открыты для всех модулей, поэтому этот метод всегда завершается успешно, когдаDнаходится в безымянном или открытом модуле.
Этот метод может использоваться кодом JNI, если в стеке нет класса вызывающего кода, для включения доступа к D member класса declaring class тогда и только тогда, когда:
- Элемент является
public, аDявляетсяpublicв пакете, который модуль, содержащийD, безусловноexports.
Этот метод нельзя использовать для включения доступа к закрытым элементам, элементам с доступом по умолчанию (на уровне пакета), защищённым нестатическим элементам или защищённым конструкторам, если объявляющий класс находится в другом модуле, нежели вызывающий код, и пакет, содержащий объявляющий класс, не открыт модулю вызывающего кода.
Этот метод нельзя использовать для включения доступа на запись к немодифицируемому полю final. К немодифицируемым относятся следующие поля:
- статические поля final, объявленные в любом классе или интерфейсе
- поля final, объявленные в скрытом классе
- поля final, объявленные в записи
Флаг accessible в состоянии true отключает проверки управления доступом языка Java только для разрешения доступа на чтение этих немодифицируемых полей final.
- Параметры:
-
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, если элемент и объявляющий класс являются открытыми, а класс находится в пакете, который экспортируется безусловно.
- Параметры:
-
obj— объект-экземпляр объявляющего класса этого отражённого объекта, если он является нестатическим методом или полем - Возвращает:
-
true, если вызывающий код может обращаться к этому отражённому объекту. - Исключения:
-
IllegalArgumentException—- если этот отражённый объект является статическим элементом или конструктором, а указанный
objне равенnull, либо - если этот отражённый объект является нестатическим методом или полем, а указанный
objравенnullили имеет тип, не являющийся подклассомdeclaring classэлемента.
- если этот отражённый объект является статическим элементом или конструктором, а указанный
- См. Спецификацию языка Java:
- 6.6 Управление доступом
- Начиная с версии:
- 9
- Внешние спецификации
- См. также:
getAnnotation
public <T extends Annotation> T getAnnotation(Class<T> annotationClass)
Обратите внимание, что любая аннотация, возвращаемая этим методом, является аннотацией объявления.
- Определён в:
-
getAnnotationв интерфейсеAnnotatedElement - Требования к реализации:
- Реализация по умолчанию выбрасывает
UnsupportedOperationException; подклассы должны переопределять этот метод. - Параметры типа:
T— тип аннотации, наличие которой проверяется и которая возвращается, если присутствует- Параметры:
-
annotationClass— объект Class, соответствующий типу аннотации - Возвращает:
- аннотацию этого элемента указанного типа, если она присутствует в этом элементе, иначе — null
- Исключения:
-
NullPointerException— если указанный класс аннотации равен null - Начиная с версии:
- 1.5
isAnnotationPresent
public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)
Возвращаемое этим методом логическое значение эквивалентно следующему выражению: getAnnotation(annotationClass) != null
- Определён в:
-
isAnnotationPresentв интерфейсеAnnotatedElement - Параметры:
-
annotationClass— объект Class, соответствующий типу аннотации - Возвращает:
- true, если в этом элементе присутствует аннотация указанного типа, иначе — false
- Исключения:
-
NullPointerException— если указанный класс аннотации равен null - Начиная с версии:
- 1.5
getAnnotationsByType
public <T extends Annotation> T[] getAnnotationsByType(Class<T> annotationClass)
AnnotatedElement.getAnnotation(Class) состоит в том, что этот метод определяет, является ли его аргумент повторяемым типом аннотации (JLS 9.6), и в этом случае пытается найти одну или несколько аннотаций этого типа, «заглядывая» в контейнерную аннотацию. Вызывающий код может изменять возвращённый массив; это не повлияет на массивы, возвращаемые другим вызывающим сторонам. Обратите внимание, что любые аннотации, возвращаемые этим методом, являются аннотациями объявления.
- Определён в:
-
getAnnotationsByTypeв интерфейсеAnnotatedElement - Требования к реализации:
- Реализация по умолчанию выбрасывает
UnsupportedOperationException; подклассы должны переопределять этот метод. - Параметры типа:
T— тип аннотации, наличие которой проверяется и которая возвращается, если присутствует- Параметры:
-
annotationClass— объект Class, соответствующий типу аннотации - Возвращает:
- все аннотации этого элемента указанного типа, связанные с этим элементом, иначе — массив нулевой длины
- Исключения:
-
NullPointerException— если указанный класс аннотации равен null - Начиная с версии:
- 1.8
getAnnotations
public Annotation[] getAnnotations()
Обратите внимание, что любые аннотации, возвращаемые этим методом, являются аннотациями объявления.
- Определён в:
-
getAnnotationsв интерфейсеAnnotatedElement - Возвращает:
- аннотации, присутствующие в этом элементе
- Начиная с версии:
- 1.5
getDeclaredAnnotation
public <T extends Annotation> T getDeclaredAnnotation(Class<T> annotationClass)
Обратите внимание, что любая аннотация, возвращаемая этим методом, является аннотацией объявления.
- Определён в:
-
getDeclaredAnnotationв интерфейсеAnnotatedElement - Параметры типа:
T— тип аннотации, наличие которой проверяется и которая возвращается, если присутствует непосредственно- Параметры:
-
annotationClass— объект Class, соответствующий типу аннотации - Возвращает:
- аннотацию этого элемента указанного типа, если она непосредственно присутствует в этом элементе, иначе — null
- Исключения:
-
NullPointerException— если указанный класс аннотации равен null - Начиная с версии:
- 1.8
getDeclaredAnnotationsByType
public <T extends Annotation> T[] getDeclaredAnnotationsByType(Class<T> annotationClass)
AnnotatedElement.getDeclaredAnnotation(Class) состоит в том, что этот метод определяет, является ли его аргумент повторяемым типом аннотации (JLS 9.6), и в этом случае пытается найти одну или несколько аннотаций этого типа, «заглядывая» в контейнерную аннотацию, если она имеется. Вызывающий код может изменять возвращённый массив; это не повлияет на массивы, возвращаемые другим вызывающим сторонам. Обратите внимание, что любые аннотации, возвращаемые этим методом, являются аннотациями объявления.
- Определён в:
-
getDeclaredAnnotationsByTypeв интерфейсеAnnotatedElement - Параметры типа:
T— тип аннотации, наличие которой проверяется и которая возвращается, если присутствует непосредственно или косвенно- Параметры:
-
annotationClass— объект Class, соответствующий типу аннотации - Возвращает:
- все аннотации этого элемента указанного типа, непосредственно или косвенно присутствующие в этом элементе, иначе — массив нулевой длины
- Исключения:
-
NullPointerException— если указанный класс аннотации равен null - Начиная с версии:
- 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://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/reflect/AccessibleObject.html