Spec-Zone.ru › OpenJDK 25

Класс 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ы используются для получения или установки полей, вызова методов либо создания и инициализации новых экземпляров классов соответственно. Каждый отражённый объект проверяет, находится ли использующий его код в соответствующем классе, пакете или модуле. Проверка при вызове из кода JNI, когда в стеке нет класса Java, проходит только в том случае, если элемент и объявляющий его класс являются открытыми, а класс находится в пакете, экспортируемом во все модули.

Единственное отличие от управления доступом языка Java состоит в том, что проверки отражённых объектов предполагают доступность для чтения. Иными словами, предполагается, что модуль, содержащий код, использующий отражённый объект, читает модуль, в котором объявлено базовое поле, метод или конструктор.

Возможность отключить проверки управления доступом языка Java (и, следовательно, включить доступ) зависит от того, соответствует ли отражённый объект элементу в экспортируемом или открытом пакете (см. setAccessible(boolean)).

См. Спецификацию языка Java:
6.6 Управление доступом
Начиная с версии:
1.2
Внешние спецификации
  • Спецификация Java Native Interface

Краткое описание конструкторов

AccessibleObject()
Модификатор Конструктор Описание
protected
Устарел.

Краткое описание методов

Модификатор и тип Метод Описание
final boolean canAccess(Object obj)
Проверяет, может ли вызывающий код обращаться к этому отражённому объекту.
<T extends Annotation>
T
getAnnotation(Class<T> annotationClass)
Возвращает аннотацию этого элемента указанного типа, если такая аннотация присутствует, иначе — null.
Annotation[] getAnnotations()
Возвращает аннотации, присутствующие в этом элементе.
<T extends Annotation>
T[]
getAnnotationsByType(Class<T> annotationClass)
Возвращает аннотации, связанные с этим элементом.
<T extends Annotation>
T
getDeclaredAnnotation(Class<T> annotationClass)
Возвращает аннотацию этого элемента указанного типа, если такая аннотация присутствует непосредственно, иначе — null.
Annotation[] getDeclaredAnnotations()
Возвращает аннотации, непосредственно присутствующие в этом элементе.
<T extends Annotation>
T[]
getDeclaredAnnotationsByType(Class<T> annotationClass)
Возвращает аннотацию или аннотации этого элемента указанного типа, если они присутствуют непосредственно или присутствуют косвенно.
boolean isAccessible()
Устарел.
Этот метод устарел, поскольку его название подразумевает, что он проверяет доступность отражённого объекта, тогда как на самом деле оно указывает, отключены ли проверки управления доступом языка Java.
boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)
Возвращает true, если в этом элементе присутствует аннотация указанного типа, иначе — false.
void setAccessible(boolean flag)
Устанавливает флаг accessible этого отражённого объекта в указанное логическое значение.
static void setAccessible(AccessibleObject[] array, boolean flag)
Вспомогательный метод для установки флага accessible массива отражённых объектов.
final boolean trySetAccessible()
Устанавливает флаг accessible этого отражённого объекта в значение true, если это возможно.

Методы, объявленные в классе Object

clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

Подробное описание конструкторов

AccessibleObject

@Deprecated(since="17") protected AccessibleObject()
Устарел.
Конструктор: используется только виртуальной машиной Java.

Подробное описание методов

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.
  • Элемент является protected static, 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 — если нельзя включить доступ
Внешние спецификации
  • Спецификация Java Native Interface
См. также:
  • trySetAccessible()
  • MethodHandles.privateLookupIn(Class, 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
        ...
    }

Если этот метод вызывается из кода JNI, когда в стеке нет класса вызывающего кода, флаг accessible можно установить, только если элемент и объявляющий класс являются открытыми, а класс находится в пакете, который экспортируется безусловно.

Возвращает:
true, если флаг accessible установлен в значение true; false, если доступ нельзя включить.
Начиная с версии:
9
Внешние спецификации
  • Спецификация Java Native Interface
См. также:
  • MethodHandles.privateLookupIn(Class, MethodHandles.Lookup)

isAccessible

@Deprecated(since="9") public boolean isAccessible()
Устарел.
Этот метод устарел, поскольку его название подразумевает, что он проверяет доступность отражённого объекта, тогда как на самом деле оно указывает, отключены ли проверки управления доступом языка Java. Этот метод может возвращать 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
Внешние спецификации
  • Спецификация Java Native Interface
См. также:
  • trySetAccessible()
  • setAccessible(boolean)

getAnnotation

public <T extends Annotation> T getAnnotation(Class<T> annotationClass)
Возвращает аннотацию этого элемента указанного типа, если такая аннотация присутствует, иначе — null.

Обратите внимание, что любая аннотация, возвращаемая этим методом, является аннотацией объявления.

Определён в:
getAnnotation в интерфейсе AnnotatedElement
Требования к реализации:
Реализация по умолчанию выбрасывает UnsupportedOperationException; подклассы должны переопределять этот метод.
Параметры типа:
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)
Возвращает аннотации, связанные с этим элементом. Если с этим элементом не связаны никакие аннотации, возвращается массив длины 0. Отличие этого метода от AnnotatedElement.getAnnotation(Class) состоит в том, что этот метод определяет, является ли его аргумент повторяемым типом аннотации (JLS 9.6), и в этом случае пытается найти одну или несколько аннотаций этого типа, «заглядывая» в контейнерную аннотацию. Вызывающий код может изменять возвращённый массив; это не повлияет на массивы, возвращаемые другим вызывающим сторонам.

Обратите внимание, что любые аннотации, возвращаемые этим методом, являются аннотациями объявления.

Определён в:
getAnnotationsByType в интерфейсе AnnotatedElement
Требования к реализации:
Реализация по умолчанию выбрасывает UnsupportedOperationException; подклассы должны переопределять этот метод.
Параметры типа:
T — тип аннотации, наличие которой проверяется и которая возвращается, если присутствует
Параметры:
annotationClass — объект Class, соответствующий типу аннотации
Возвращает:
все аннотации этого элемента указанного типа, связанные с этим элементом, иначе — массив нулевой длины
Исключения:
NullPointerException — если указанный класс аннотации равен null
Начиная с версии:
1.8

getAnnotations

public Annotation[] getAnnotations()
Возвращает аннотации, присутствующие в этом элементе. Если в этом элементе нет присутствующих аннотаций, возвращается массив длины 0. Вызывающий код может изменять возвращённый массив; это не повлияет на массивы, возвращаемые другим вызывающим сторонам.

Обратите внимание, что любые аннотации, возвращаемые этим методом, являются аннотациями объявления.

Определён в:
getAnnotations в интерфейсе AnnotatedElement
Возвращает:
аннотации, присутствующие в этом элементе
Начиная с версии:
1.5

getDeclaredAnnotation

public <T extends Annotation> T getDeclaredAnnotation(Class<T> annotationClass)
Возвращает аннотацию этого элемента указанного типа, если такая аннотация присутствует непосредственно, иначе — null. Этот метод игнорирует унаследованные аннотации. (Возвращает null, если в этом элементе нет непосредственно присутствующих аннотаций.)

Обратите внимание, что любая аннотация, возвращаемая этим методом, является аннотацией объявления.

Определён в:
getDeclaredAnnotation в интерфейсе AnnotatedElement
Параметры типа:
T — тип аннотации, наличие которой проверяется и которая возвращается, если присутствует непосредственно
Параметры:
annotationClass — объект Class, соответствующий типу аннотации
Возвращает:
аннотацию этого элемента указанного типа, если она непосредственно присутствует в этом элементе, иначе — null
Исключения:
NullPointerException — если указанный класс аннотации равен null
Начиная с версии:
1.8

getDeclaredAnnotationsByType

public <T extends Annotation> T[] getDeclaredAnnotationsByType(Class<T> annotationClass)
Возвращает аннотацию или аннотации этого элемента указанного типа, если они присутствуют непосредственно или присутствуют косвенно. Этот метод игнорирует унаследованные аннотации. Если в этом элементе нет указанных аннотаций, присутствующих непосредственно или косвенно, возвращается массив длины 0. Отличие этого метода от AnnotatedElement.getDeclaredAnnotation(Class) состоит в том, что этот метод определяет, является ли его аргумент повторяемым типом аннотации (JLS 9.6), и в этом случае пытается найти одну или несколько аннотаций этого типа, «заглядывая» в контейнерную аннотацию, если она имеется. Вызывающий код может изменять возвращённый массив; это не повлияет на массивы, возвращаемые другим вызывающим сторонам.

Обратите внимание, что любые аннотации, возвращаемые этим методом, являются аннотациями объявления.

Определён в:
getDeclaredAnnotationsByType в интерфейсе AnnotatedElement
Параметры типа:
T — тип аннотации, наличие которой проверяется и которая возвращается, если присутствует непосредственно или косвенно
Параметры:
annotationClass — объект Class, соответствующий типу аннотации
Возвращает:
все аннотации этого элемента указанного типа, непосредственно или косвенно присутствующие в этом элементе, иначе — массив нулевой длины
Исключения:
NullPointerException — если указанный класс аннотации равен null
Начиная с версии:
1.8

getDeclaredAnnotations

public Annotation[] getDeclaredAnnotations()
Возвращает аннотации, непосредственно присутствующие в этом элементе. Этот метод игнорирует унаследованные аннотации. Если в этом элементе нет непосредственно присутствующих аннотаций, возвращается массив длины 0. Вызывающий код может изменять возвращённый массив; это не повлияет на массивы, возвращаемые другим вызывающим сторонам.

Обратите внимание, что любые аннотации, возвращаемые этим методом, являются аннотациями объявления.

Определён в:
getDeclaredAnnotations в интерфейсе AnnotatedElement
Требования к реализации:
Реализация по умолчанию выбрасывает UnsupportedOperationException; подклассы должны переопределять этот метод.
Возвращает:
аннотации, непосредственно присутствующие в этом элементе
Начиная с версии:
1.5

Сообщить об ошибке или предложить улучшение
Дополнительные справочные материалы по API и документацию для разработчиков см. в разделе Документация Java SE, содержащем более подробные описания для разработчиков, обзоры концепций, определения терминов, обходные решения и рабочие примеры кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или её аффилированных лиц в США и других странах.
Авторское право © 1993, 2025, Oracle и/или её аффилированные лица, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
Все права защищены. Использование регулируется условиями лицензии и политикой распространения документации.

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API