Spec-Zone.ru › OpenJDK 24

Класс 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 для этого отражённого объекта на указанное значение boolean.
static void setAccessible(AccessibleObject[] array, boolean flag)
Удобный метод для установки флага accessible для массива отражённых объектов.
final boolean trySetAccessible()
Устанавливает флаг accessible для этого отражённого объекта на значение true, если это возможно.

Методы, объявленные в классе java.lang.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).

Исключение 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 находится в пакете, к которому модуль, содержащий D opens как минимум к модулю, содержащему C. Все пакеты в безымянных и открытых модулях открыты для всех модулей, поэтому этот метод всегда выполняется успешно, когда D находится в безымянном или открытом модуле.

Этот метод может использоваться кодом JNI без вызывающего класса в стеке для включения доступа к member объекта declaring class D, если и только если:

  • Член является public, и D равен public в пакете, к которому модуль, содержащий D exports безусловно.

Этот метод не может использоваться для включения доступа к закрытым членам, членам с доступом по умолчанию (пакетному), защищенным экземплярам членов или защищенным конструкторам, когда класс объявления находится в другом модуле, кроме вызывающего, и пакет, содержащий класс объявления, не открыт для модуля вызывающего.

Флаг accessible, когда true, подавляет проверки контроля доступа языка Java, чтобы только включить чтение доступ к этим неизменяемым конечным полям.

Параметры:
flag - новое значение флага accessible
Исключения:
InaccessibleObjectException - если доступ нельзя включить
Внешние спецификации
  • Спецификация Java Native Interface
См. также:
  • 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
         ...
     }
 

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

Возвращает:
true, если флаг accessible установлен в true; false если доступ нельзя включить.
С:
9
Внешние спецификации
  • Спецификация Java Native Interface
См. также:
  • MethodHandles.privateLookupIn(java.lang.Class<?>, java.lang.invoke.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, если член и класс объявления являются общедоступными, а класс находится в пакете, который экспортирован безусловно.

Parameters:
obj - объект-экземпляр класса объявления этого отраженного объекта, если это метод или поле экземпляра
Returns:
true, если вызывающий код может получить доступ к этому отраженному объекту.
Throws:
IllegalArgumentException -
  • если этот отраженный объект является статическим членом или конструктором, и заданный obj не является null, или
  • если этот отраженный объект является методом или полем экземпляра, и заданный obj является null или имеет тип, который не является подклассом declaring class члена.
См. Спецификацию языка Java:
6.6 Управление доступом
Since:
9
Внешние спецификации
  • Спецификация Java Native Interface
См. также:
  • trySetAccessible()
  • setAccessible(boolean)

getAnnotation

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

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

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)
Возвращает true, если аннотация для указанного типа присутствует на этом элементе, иначе false. Этот метод предназначен в основном для удобного доступа к маркерным аннотациям.

Логическое значение, возвращаемое этим методом, эквивалентно: 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)
Возвращает аннотации, связанные с этим элементом. Если аннотаций, связанных с этим элементом, нет, возвращается массив длиной 0. Различие между этим методом и 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()
Возвращает аннотации, присутствующие на этом элементе. Если аннотаций, присутствующих на этом элементе, нет, возвращается массив длиной 0. Вызывающий метод может свободно изменять возвращаемый массив; это не повлияет на массивы, возвращаемые другим вызывающим методам.

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

Specified by:
getAnnotations в интерфейсе AnnotatedElement
Returns:
аннотации, присутствующие на этом элементе
Since:
1.5

getDeclaredAnnotation

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

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

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)
Возвращает аннотацию(и) этого элемента для указанного типа, если такие аннотации непосредственно присутствуют или косвенно присутствуют. Этот метод игнорирует унаследованные аннотации. Если указанные аннотации не присутствуют непосредственно или косвенно на этом элементе, возвращается массив длиной 0. Различие между этим методом и 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()
Возвращает аннотации, непосредственно присутствующие на этом элементе. Этот метод игнорирует унаследованные аннотации. Если на этом элементе нет аннотаций непосредственно присутствующих, возвращаемое значение — массив длины 0. Вызывающий метод свободен изменять возвращаемый массив; это не повлияет на массивы, возвращаемые другим вызывающим сторонам.

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

Указано в:
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

Spec-Zone.ru

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