Класс 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
Краткое описание конструкторов
| Модификатор | Конструктор | Описание |
|---|---|---|
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 для этого отраженного объекта на указанное значение boolean. |
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равенpublicв пакете, к которому модуль, содержащийD,exportsпо крайней мере в модуль, содержащийC. - Член является
protectedstatic,Dравенpublicв пакете, к которому модуль, содержащийDэкспортирует по крайней мере в модуль, содержащийC, иCявляется подклассомD. -
Dнаходится в пакете, к которому модуль, содержащийDopensпо крайней мере в модуль, содержащийC. Все пакеты в безымянных и открытых модулях открыты для всех модулей, и поэтому этот метод всегда выполняется успешно, когдаDнаходится в безымянном или открытом модуле.
Этот метод не может использоваться для включения доступа к частным членам, членам с доступом по умолчанию (пакетному), защищённым экземплярам членов или защищённым конструкторам, когда класс объявления находится в другом модуле по сравнению с вызывающим объектом, а пакет, содержащий класс объявления, не открыт для модуля вызывающего объекта.
Этот метод не может использоваться для включения записи доступа к неизменяемому окончательному полю. Следующие поля неизменяемы:
- статические конечные поля, объявленные в любом классе или интерфейсе
- конечные поля, объявленные в скрытом классе
- конечные поля, объявленные в записи
Флаг 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
...
}
Если есть менеджер безопасности, его метод 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, с вариацией, указанной в описании класса.
- Параметры:
-
obj- объект-экземпляр объявляющего класса этого отражённого объекта, если это экземпляр метода или поля - Возвращает:
-
trueесли вызывающий объект может получить доступ к этому отражённому объекту. - Исключения:
-
IllegalArgumentException-- если этот отражённый объект является статическим членом или конструктором, и заданный
objне являетсяnull, или - если этот отражённый объект является экземпляром метода или поля, и заданный
objявляетсяnullили типа, который не является подклассомdeclaring classчлена.
- если этот отражённый объект является статическим членом или конструктором, и заданный
- См. Спецификацию языка Java:
- 6.6 Контроль доступа
- С:
- 9
- См. также:
getAnnotation
public <T extends Annotation> T getAnnotation(Class<T> annotationClass)
Обратите внимание, что любая аннотация, возвращаемая этим методом, является аннотацией объявления.
- Specified by:
-
getAnnotationв интерфейсеAnnotatedElement - Требования к реализации:
- По умолчанию метод выбрасывает
UnsupportedOperationException; подклассы должны переопределить этот метод. - Параметры типа:
-
T- тип аннотации, для которого выполняется поиск и которая возвращается, если присутствует - Параметры:
-
annotationClass- объект Class, соответствующий типу аннотации - Возвращает:
- аннотацию элемента для указанного типа аннотации, если она присутствует на этом элементе, в противном случае null
- Исключения:
-
NullPointerException- если предоставленный класс аннотации равен null - С тех пор:
- 1.5
isAnnotationPresent
public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)
Значение 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)
AnnotatedElement.getAnnotation(Class) заключается в том, что этот метод обнаруживает, является ли его аргумент повторяющимся типом аннотации (JLS 9.6), и в этом случае пытается найти одну или несколько аннотаций этого типа, «посмотрев» в контейнерную аннотацию. Вызывающий метод имеет право модифицировать возвращаемый массив; это не повлияет на массивы, возвращаемые другим вызывающим методам. Обратите внимание, что любые аннотации, возвращаемые этим методом, являются аннотациями объявления.
- Specified by:
-
getAnnotationsByTypeв интерфейсеAnnotatedElement - Требования к реализации:
- По умолчанию метод выбрасывает
UnsupportedOperationException; подклассы должны переопределить этот метод. - Параметры типа:
-
T- тип аннотации, для которого выполняется поиск и которая возвращается, если присутствует - Параметры:
-
annotationClass- объект Class, соответствующий типу аннотации - Возвращает:
- все аннотации элемента для указанного типа аннотации, если они ассоциированы с этим элементом, в противном случае массив длиной ноль
- Исключения:
-
NullPointerException- если предоставленный класс аннотации равен null - С тех пор:
- 1.8
getAnnotations
public Annotation[] getAnnotations()
Обратите внимание, что любые аннотации, возвращаемые этим методом, являются аннотациями объявления.
- Specified by:
-
getAnnotationsв интерфейсеAnnotatedElement - Возвращает:
- аннотации, присутствующие на этом элементе
- С тех пор:
- 1.5
getDeclaredAnnotation
public <T extends Annotation> T getDeclaredAnnotation(Class<T> annotationClass)
Обратите внимание, что любая аннотация, возвращаемая этим методом, является аннотацией объявления.
- Specified by:
-
getDeclaredAnnotationв интерфейсеAnnotatedElement - Параметры типа:
-
T- тип аннотации, для которого выполняется поиск и которая возвращается, если непосредственно присутствует - Параметры:
-
annotationClass- объект Class, соответствующий типу аннотации - Возвращает:
- аннотацию элемента для указанного типа аннотации, если она непосредственно присутствует на этом элементе, в противном случае null
- Исключения:
-
NullPointerException- если предоставленный класс аннотации равен null - С тех пор:
- 1.8
getDeclaredAnnotationsByType
public <T extends Annotation> T[] getDeclaredAnnotationsByType(Class<T> annotationClass)
AnnotatedElement.getDeclaredAnnotation(Class) заключается в том, что этот метод обнаруживает, является ли его аргумент повторяющимся типом аннотации (JLS 9.6), и в этом случае пытается найти одну или несколько аннотаций этого типа, «посмотрев» в контейнерную аннотацию, если она присутствует. Вызывающий метод имеет право модифицировать возвращаемый массив; это не повлияет на массивы, возвращаемые другим вызывающим методам. Обратите внимание, что любые аннотации, возвращаемые этим методом, являются аннотациями объявления.
- Specified by:
-
getDeclaredAnnotationsByTypeв интерфейсеAnnotatedElement - Параметры типа:
-
T- тип аннотации, для которого выполняется поиск и которая возвращается, если непосредственно или косвенно присутствует - Параметры:
-
annotationClass- объект Class, соответствующий типу аннотации - Возвращает:
- все аннотации элемента для указанного типа аннотации, если они непосредственно или косвенно присутствуют на этом элементе, в противном случае массив длиной ноль
- Исключения:
-
NullPointerException- если предоставленный класс аннотации равен null - С тех пор:
- 1.8
getDeclaredAnnotations
public Annotation[] getDeclaredAnnotations()
Обратите внимание, что любые аннотации, возвращаемые этим методом, являются аннотациями объявления.
- 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