Класс 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>
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 для массива отражённых объектов с одной проверкой безопасности (для повышения эффективности).

boolean trySetAccessible()

Устанавливает флаг accessible для этого отражённого объекта на true, если возможно.

Методы, объявленные в классе 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 в пакете, к которому модуль, содержащий D exports по крайней мере модулю, содержащему C.
  • Элемент является protected static, D равен public в пакете, который модуль, содержащий D экспортирует по крайней мере модулю, содержащему C, и C является подклассом D.
  • D находится в пакете, который модуль, содержащий D opens по крайней мере модулю, содержащему 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()
Устарело.
Этот метод устарел, потому что его имя предполагает, что он проверяет, доступен ли отраженный объект, когда на самом деле он указывает, подавлены ли проверки контроля доступа языка Java. Этот метод может вернуть 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

Spec-Zone .ru
спецификации, руководства, описания, API