Класс 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
- Внешние спецификации
Краткое описание конструкторов
| Модификатор | Конструктор | Описание |
|---|---|---|
protected |
Устаревший. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
final boolean |
canAccess |
Проверка возможности доступа к этому отражённому объекту вызывающим объектом. |
<T extends Annotation> |
getAnnotation |
Возвращает аннотацию этого элемента для указанного типа, если такая аннотация присутствует, иначе null. |
Annotation[] |
getAnnotations() |
Возвращает аннотации, которые присутствуют на этом элементе. |
<T extends Annotation> |
getAnnotationsByType |
Возвращает аннотации, которые связаны с этим элементом. |
<T extends Annotation> |
getDeclaredAnnotation |
Возвращает аннотацию этого элемента для указанного типа, если такая аннотация непосредственно присутствует, иначе null. |
Annotation[] |
getDeclaredAnnotations() |
Возвращает аннотации, которые непосредственно присутствуют на этом элементе. |
<T extends Annotation> |
getDeclaredAnnotationsByType |
Возвращает аннотацию(и) этого элемента для указанного типа, если такие аннотации непосредственно присутствуют или косвенно присутствуют. |
boolean |
isAccessible() |
Устаревший. Этот метод устарел, потому что его название предполагает проверку доступности отражённого объекта, когда на самом деле он указывает, подавлены ли проверки Java-языковых ограничений доступа. |
boolean |
isAnnotationPresent |
Возвращает true, если аннотация для указанного типа присутствует на этом элементе, иначе false. |
void |
setAccessible |
Устанавливает флаг accessible для этого отражённого объекта на указанное булево значение. |
static void |
setAccessible |
Удобный метод для установки флага accessible для массива отражённых объектов с одной проверкой безопасности (для повышения эффективности). |
final boolean |
trySetAccessible() |
Устанавливает флаг accessible для этого отражённого объекта в true при возможности. |
Подробное описание конструкторов
AccessibleObject
@Deprecated(since="17") protected AccessibleObject()
Подробное описание методов
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 - См. также:
setAccessible
public void setAccessible(boolean flag)
accessible для этого отражённого объекта на указанное значение boolean. Значение true указывает, что отражённый объект должен подавлять проверки контроля доступа языка Java при его использовании. Значение false указывает, что отражённый объект должен выполнять проверки контроля доступа языка Java при его использовании, с вариантами, указанными в описании класса. Этот метод может быть использован вызывающим объектом в классе C для разрешения доступа к member объекта declaring class D, если выполняются следующие условия:
-
CиDнаходятся в одном модуле. - Член является
publicиDнаходится в пакете, который модуль, содержащийDexportsпо крайней мере модулю, содержащемуC. - Член является
protectedstatic,Dнаходится в пакете, который модуль, содержащийDэкспортирует по крайней мере модулю, содержащемуC, иCявляется подклассомD. -
Dнаходится в пакете, который модуль, содержащийDopensпо крайней мере модулю, содержащемуC. Все пакеты в безымянных и открытых модулях открыты для всех модулей, поэтому этот метод всегда выполняется успешно, когдаDнаходится в безымянном или открытом модуле.
Этот метод может использоваться кодом JNI без вызывающего класса в стеке для разрешения доступа к member объекта declaring class D, если и только если:
- Член является
publicиDнаходится в пакете, который модуль, содержащийDexportsбезусловно.
Этот метод не может использоваться для разрешения доступа к закрытым членам, членам с доступом по умолчанию (пакет), защищённым экземплярам членов или защищённым конструкторам, когда объявляющий класс находится в другом модуле, кроме вызывающего, и пакет, содержащий объявляющий класс, не открыт для модуля вызывающего.
Этот метод не может использоваться для разрешения записи доступа к неизменяемому заключительному полю. Следующие поля являются неизменяемыми:
- статические заключительные поля, объявленные в любом классе или интерфейсе
- заключительные поля, объявленные в скрытом классе
- заключительные поля, объявленные в записи
Флаг accessible при true подавляет проверки контроля доступа языка Java для разрешения только чтения доступа к этим неизменяемым заключительным полям.
Если есть менеджер безопасности, его метод checkPermission сначала вызывается с разрешением ReflectPermission("suppressAccessChecks").
- Параметры:
-
flag- новое значение флагаaccessible - Исключения:
-
InaccessibleObjectException- если доступ не может быть разрешен -
SecurityException- если запрос отклонен менеджером безопасности - Внешние спецификации
- См. также:
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
- Внешние спецификации
- См. также:
isAccessible
@Deprecated(since="9") public boolean isAccessible()
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
- See Also:
getAnnotation
public <T extends Annotation> T getAnnotation(Class<T> annotationClass)
Обратите внимание, что любая аннотация, возвращённая этим методом, является аннотацией объявления.
- 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)
Логическое значение, возвращаемое этим методом, эквивалентно: 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)
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()
Обратите внимание, что любые аннотации, возвращённые этим методом, являются аннотациями объявления.
- Specified by:
-
getAnnotationsв интерфейсеAnnotatedElement - Returns:
- аннотации, присутствующие в этом элементе
- Since:
- 1.5
getDeclaredAnnotation
public <T extends Annotation> T getDeclaredAnnotation(Class<T> annotationClass)
Обратите внимание, что любая аннотация, возвращённая этим методом, является аннотацией объявления.
- 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)
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()
Обратите внимание, что любые аннотации, возвращённые этим методом, являются аннотациями объявления.
- 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