Spec-Zone.ru › OpenJDK 17

Класс 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

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

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).

Если есть менеджер безопасности, его метод 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 находится в безымянном или открытом модуле.

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

Этот метод не может использоваться для включения записи доступа к неизменяемому окончательному полю. Следующие поля неизменяемы:

  • статические конечные поля, объявленные в любом классе или интерфейсе
  • конечные поля, объявленные в скрытом классе
  • конечные поля, объявленные в записи

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

Если есть менеджер безопасности, его метод 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 члена.
См. Спецификацию языка Java:
6.6 Контроль доступа
С:
9
См. также:
  • trySetAccessible()
  • setAccessible(boolean)

getAnnotation

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

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

Specified by:
getAnnotation в интерфейсе AnnotatedElement
Требования к реализации:
По умолчанию метод выбрасывает UnsupportedOperationException; подклассы должны переопределить этот метод.
Параметры типа:
T - тип аннотации, для которого выполняется поиск и которая возвращается, если присутствует
Параметры:
annotationClass - объект Class, соответствующий типу аннотации
Возвращает:
аннотацию элемента для указанного типа аннотации, если она присутствует на этом элементе, в противном случае null
Исключения:
NullPointerException - если предоставленный класс аннотации равен null
С тех пор:
1.5

isAnnotationPresent

public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)
Возвращает true, если аннотация указанного типа присутствует на этом элементе, в противном случае false. Этот метод предназначен в основном для удобного доступа к аннотациям-меткам.

Значение true, возвращаемое этим методом, эквивалентно: getAnnotation(annotationClass) != null

Specified by:
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), и в этом случае пытается найти одну или несколько аннотаций этого типа, «посмотрев» в контейнерную аннотацию. Вызывающий метод имеет право модифицировать возвращаемый массив; это не повлияет на массивы, возвращаемые другим вызывающим методам.

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

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

getAnnotations

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

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

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

getDeclaredAnnotation

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

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

Specified by:
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), и в этом случае пытается найти одну или несколько аннотаций этого типа, «посмотрев» в контейнерную аннотацию, если она присутствует. Вызывающий метод имеет право модифицировать возвращаемый массив; это не повлияет на массивы, возвращаемые другим вызывающим методам.

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

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

getDeclaredAnnotations

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

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

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

© 1993, 2021, 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/17/docs/api/java.base/java/lang/reflect/AccessibleObject.html

Spec-Zone.ru

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