Класс AccessibleObject
- Все реализуемые интерфейсы:
AnnotatedElement
- Прямые известные подклассы:
Executable, Field
public class AccessibleObject extends Object implements AnnotatedElement
AccessibleObject является базовым классом для объектов Field, Method и Constructor (известных как рефлексивные объекты). Он позволяет пометить рефлексивный объект, чтобы при его использовании отключить проверки контроля доступа языка Java. Это позволяет сложным приложениям с достаточными привилегиями, таким как сериализация объектов Java или другие механизмы сохранения данных, манипулировать объектами способом, который обычно был бы запрещён. Контроль доступа языка Java запрещает использовать закрытые члены за пределами их класса верхнего уровня; члены с пакетным доступом — за пределами их пакета; защищённые члены — за пределами их пакета или подклассов; а открытые члены — за пределами их модуля, если только они не объявлены в пакете exported и пользователь не reads этот модуль. По умолчанию контроль доступа языка Java применяется (с одним исключением), когда Fields, Methods или Constructors используются соответственно для получения или установки значений полей, вызова методов или создания и инициализации новых экземпляров классов. Каждый рефлексивный объект проверяет, находится ли использующий его код в соответствующем классе, пакете или модуле. Проверка при вызове из кода 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, если это возможно. |
Методы, объявленные в классе Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait | Модификатор и тип | Метод | Описание |
|---|---|---|
protected Object |
clone() |
Создаёт и возвращает копию этого объекта. |
boolean |
equals |
Указывает, равен ли какой-либо другой объект этому объекту. |
protected void |
finalize() |
Устарел; будет удалён: этот элемент API подлежит удалению в будущей версии. Финализация устарела и подлежит удалению в одном из будущих выпусков. |
final Class |
getClass() |
Возвращает класс времени выполнения этого Object. |
int |
hashCode() |
Возвращает хеш-код этого объекта. |
final void |
notify() |
Пробуждает один поток, ожидающий на мониторе этого объекта. |
final void |
notifyAll() |
Пробуждает все потоки, ожидающие на мониторе этого объекта. |
String |
toString() |
Возвращает строковое представление объекта. |
final void |
wait() |
Приостанавливает текущий поток до его пробуждения, обычно посредством уведомления или прерывания. |
final void |
wait |
Приостанавливает текущий поток до его пробуждения, обычно посредством уведомления или прерывания, либо до истечения заданного времени. |
final void |
wait |
Приостанавливает текущий поток до его пробуждения, обычно посредством уведомления или прерывания, либо до истечения заданного времени. |
Подробное описание конструкторов
AccessibleObject
@Deprecated(since="17") protected AccessibleObject()
Подробное описание методов
setAccessible
public static void setAccessible(AccessibleObject[] array, boolean flag)
accessible для массива отражённых объектов. Этот метод можно использовать для предоставления доступа ко всем отражённым объектам в массиве, если доступ к каждому отражённому объекту можно предоставить способом, описанным в setAccessible(boolean).
Выбрасывается SecurityException, если любой элемент входного array является объектом Constructor для класса java.lang.Class и flag имеет значение true.
- Параметры:
-
array- массив AccessibleObjects -
flag- новое значение флагаaccessibleдля каждого объекта - Исключения:
-
InaccessibleObjectException- если не удаётся предоставить доступ ко всем объектам в массиве -
SecurityException- если элемент массива является конструктором дляjava.lang.Class -
NullPointerException- еслиarrayили любой из его элементов равенnull
setAccessible
public void setAccessible(boolean flag)
accessible этого отражённого объекта указанное логическое значение. Значение 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находится в пакете, который модуль, содержащийD,opensкак минимум модулю, содержащемуC. Все пакеты в безымянных и открытых модулях открыты для всех модулей, поэтому этот метод всегда завершается успешно, еслиDнаходится в безымянном или открытом модуле.
Код JNI, в стеке которого нет вызывающего класса, может использовать этот метод, чтобы предоставить доступ к member класса declaring class D тогда и только тогда, когда:
- Элемент является
public, аD—publicв пакете, который модуль, содержащийD,exportsбезусловно.
Этот метод нельзя использовать для предоставления доступа к закрытым элементам, элементам с доступом по умолчанию (на уровне пакета), защищённым нестатическим элементам или защищённым конструкторам, если объявляющий класс находится в другом модуле, нежели вызывающий код, а пакет, содержащий объявляющий класс, не открыт для модуля вызывающего кода.
- Параметры:
-
flag- новое значение флагаaccessible - Исключения:
-
InaccessibleObjectException- если не удаётся предоставить доступ - Внешние спецификации
- См. также:
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 можно установить, только если элемент и объявляющий класс являются общедоступными, а класс находится в пакете, который экспортируется безусловно.
- Возвращает:
-
true, если флагaccessibleустановлен в значениеtrue;false, если не удаётся предоставить доступ. - Начиная с версии:
- 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, если элемент и объявляющий класс являются общедоступными, а класс находится в пакете, который экспортируется безусловно.
- Параметры:
-
obj- объект-экземпляр объявляющего класса этого отражённого объекта, если он является нестатическим методом или полем - Возвращает:
-
true, если вызывающий код может получить доступ к этому отражённому объекту. - Исключения:
-
IllegalArgumentException-- если этот отражённый объект является статическим элементом или конструктором, а указанный
objне равенnull, или - если этот отражённый объект является нестатическим методом или полем, а указанный
objравенnullлибо имеет тип, который не является подклассомdeclaring classэлемента.
- если этот отражённый объект является статическим элементом или конструктором, а указанный
- См. Спецификацию языка Java:
- 6.6 Управление доступом
- Начиная с версии:
- 9
- Внешние спецификации
- См. также:
getAnnotation
public <T extends Annotation> T getAnnotation(Class<T> annotationClass)
Обратите внимание, что любая аннотация, возвращаемая этим методом, является аннотацией объявления.
- Определён в:
-
getAnnotationв интерфейсеAnnotatedElement - Требования к реализации:
- Реализация по умолчанию выбрасывает
UnsupportedOperationException; подклассам следует переопределить этот метод. - Параметры типа:
T- тип аннотации, наличие которой проверяется и которая возвращается, если она присутствует- Параметры:
-
annotationClass- объект Class, соответствующий типу аннотации - Возвращает:
- аннотацию этого элемента указанного типа, если она присутствует у этого элемента, иначе null
- Исключения:
-
NullPointerException- если указанный класс аннотации равен null - Начиная с версии:
- 1.5
isAnnotationPresent
public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)
Возвращаемое этим методом логическое значение эквивалентно: getAnnotation(annotationClass) != null
- Определён в:
-
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), и, если да, пытается найти одну или несколько аннотаций этого типа, «просматривая» контейнерную аннотацию. Вызывающий этот метод может изменять возвращённый массив; это не повлияет на массивы, возвращаемые другим вызывающим кодом. Обратите внимание, что любые аннотации, возвращаемые этим методом, являются аннотациями объявлений.
- Указано в:
-
getAnnotationsByTypeв интерфейсеAnnotatedElement - Требования к реализации:
- Реализация по умолчанию выбрасывает
UnsupportedOperationException; подклассам следует переопределить этот метод. - Параметры типа:
T— тип аннотации, наличие которой проверяется и которая возвращается, если присутствует- Параметры:
-
annotationClass— объект Class, соответствующий типу аннотации - Возвращает:
- все аннотации этого элемента указанного типа, связанные с этим элементом; в противном случае — массив нулевой длины
- Выбрасывает:
-
NullPointerException— если указанный класс аннотации равен null - Начиная с версии:
- 1.8
getAnnotations
public Annotation[] getAnnotations()
Обратите внимание, что любые аннотации, возвращаемые этим методом, являются аннотациями объявлений.
- Указано в:
-
getAnnotationsв интерфейсеAnnotatedElement - Возвращает:
- аннотации, имеющиеся у этого элемента
- Начиная с версии:
- 1.5
getDeclaredAnnotation
public <T extends Annotation> T getDeclaredAnnotation(Class<T> annotationClass)
Обратите внимание, что любая аннотация, возвращаемая этим методом, является аннотацией объявления.
- Указано в:
-
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), и, если да, пытается найти одну или несколько аннотаций этого типа, «просматривая» контейнерную аннотацию, если она имеется. Вызывающий этот метод может изменять возвращённый массив; это не повлияет на массивы, возвращаемые другим вызывающим кодом. Обратите внимание, что любые аннотации, возвращаемые этим методом, являются аннотациями объявлений.
- Указано в:
-
getDeclaredAnnotationsByTypeв интерфейсеAnnotatedElement - Параметры типа:
T— тип аннотации, наличие которой проверяется и которая возвращается, если присутствует непосредственно или косвенно- Параметры:
-
annotationClass— объект Class, соответствующий типу аннотации - Возвращает:
- все аннотации этого элемента указанного типа, если они присутствуют у этого элемента непосредственно или косвенно; в противном случае — массив нулевой длины
- Выбрасывает:
-
NullPointerException— если указанный класс аннотации равен null - Начиная с версии:
- 1.8
getDeclaredAnnotations
public Annotation[] getDeclaredAnnotations()
Обратите внимание, что любые аннотации, возвращаемые этим методом, являются аннотациями объявлений.
- Указано в:
-
getDeclaredAnnotationsв интерфейсеAnnotatedElement - Требования к реализации:
- Реализация по умолчанию выбрасывает
UnsupportedOperationException; подклассам следует переопределить этот метод. - Возвращает:
- аннотации, непосредственно присутствующие у этого элемента
- Начиная с версии:
- 1.5
© 1993, 2025, 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.