Spec-Zone.ru › OpenJDK 21

Класс AccessibleObject

java.lang.Object
java.lang.reflect.AccessibleObject
Все реализованные интерфейсы:
AnnotatedElement
Непосредственные известные подклассы:
Executable, Field
public class AccessibleObject extends Object implements AnnotatedElement
Класс AccessibleObject является базовым классом для объектов Field, Method, и Constructor (известных как отражённые объекты). Он предоставляет возможность помечать отражённый объект как подавляющий проверки Java-языковых ограничений доступа при его использовании. Это позволяет сложным приложениям с достаточными привилегиями, например, Java Object Serialization или другим механизмам персистенции, манипулировать объектами способом, который обычно запрещён.

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

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

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

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

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

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

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

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

Если есть менеджер безопасности, его метод checkPermission сначала вызывается с разрешением ReflectPermission("suppressAccessChecks").

Параметры:
flag - новое значение флага accessible
Исключения:
InaccessibleObjectException - если доступ не может быть разрешен
SecurityException - если запрос отклонен менеджером безопасности
Внешние спецификации
  • Спецификация 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 может быть установлен только в том случае, если член и объявляющий класс являются общедоступными, а класс находится в пакете, который экспортируется безусловно.

Если есть менеджер безопасности, его метод checkPermission сначала вызывается с разрешением ReflectPermission("suppressAccessChecks").

Возвращает:
true если флаг accessible установлен в значение true; false если доступ не может быть разрешён.
Исключения:
SecurityException - если запрос отклонен менеджером безопасности
С:
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 члена.
See Java Language Specification:
6.6 Управление доступом
Since:
9
External Specifications
  • Спецификация Java Native Interface
See Also:
  • trySetAccessible()
  • setAccessible(boolean)

getAnnotation

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

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

Specified by:
getAnnotation в интерфейсе AnnotatedElement
Implementation Requirements:
Метод по умолчанию генерирует UnsupportedOperationException; подклассы должны переопределять этот метод.
Type Parameters:
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
Implementation Requirements:
Метод по умолчанию генерирует UnsupportedOperationException; подклассы должны переопределять этот метод.
Type Parameters:
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
Type Parameters:
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
Type Parameters:
T - тип аннотации, для которой выполняется запрос, и которая возвращается, если она непосредственно или косвенно присутствует
Parameters:
annotationClass - объект Class, соответствующий типу аннотации
Returns:
все аннотации элемента для указанного типа аннотации, если они непосредственно или косвенно присутствуют в элементе, иначе массив длиной ноль
Throws:
NullPointerException - если заданный класс аннотации равен null
Since:
1.8

getDeclaredAnnotations

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

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

Specified by:
getDeclaredAnnotations в интерфейсе AnnotatedElement
Implementation Requirements:
Метод по умолчанию генерирует UnsupportedOperationException; подклассы должны переопределять этот метод.
Returns:
непосредственно присутствующие в этом элементе аннотации
Since:
1.5

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

Spec-Zone.ru

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