- java.lang.Object
-
- java.lang.reflect.AccessibleObject
-
- 实现的所有接口
-
AnnotatedElement
- 已知直接子类:
-
Executable
,字段
public class AccessibleObjectextends Objectimplements AnnotatedElement
所述AccessibleObject
类是基础类字段
,方法
,和构造器
对象(被称为反射的对象 )。 它提供了将反射对象标记为在使用时禁止检查Java语言访问控制的功能。 这允许具有足够权限的复杂应用程序(例如Java对象序列化或其他持久性机制)以通常被禁止的方式操纵对象。Java语言访问控制可防止在顶级类之外使用私有成员; 包裹访问成员在他们的包裹外; 受保护的成员在他们的包或子类之外; 除非在
exported
程序包和用户reads
中声明其模块,否则模块外的公共成员。 默认情况下,当字段
s,方法
s或构造器
用于获取或设置字段,调用方法或创建和初始化类的新实例时,将强制执行Java语言访问控制(使用一种变体)。 每个反射对象都会检查使用它的代码是否在适当的类,包或模块中。Java语言访问控制的一个变体是反射对象的检查假定可读性。 也就是说,假定包含使用反射对象的模块读取声明了基础字段,方法或构造函数的模块。
是否可以抑制对Java语言访问控制的检查(因此,是否可以启用访问)取决于反射对象是否对应于导出或打开包中的成员(请参阅
setAccessible(boolean)
)。- 从以下版本开始:
- 1.2
- See The Java™ Language Specification:
- 6.6访问控制
-
-
构造方法摘要
构造方法 变量 构造器 描述 protected
AccessibleObject()
构造函数:仅供Java虚拟机使用。
-
方法摘要
所有方法 静态方法 实例方法 具体的方法 弃用的方法 变量和类型 方法 描述 boolean
canAccess(Object obj)
测试调用者是否可以访问此反射对象。<T extends Annotation>
TgetAnnotation(类<T> annotationClass)
返回该元素的,如果这样的注释 ,否则返回null指定类型的注释。Annotation[]
getAnnotations()
返回此元素上 存在的注释。<T extends Annotation>
T[]getAnnotationsByType(类<T> annotationClass)
返回与此元素 关联的注释。<T extends Annotation>
TgetDeclaredAnnotation(类<T> annotationClass)
如果 直接存在这样的注释,则返回指定类型的此元素的注释,否则返回null。Annotation[]
getDeclaredAnnotations()
返回 直接出现在此元素上的注释。<T extends Annotation>
T[]getDeclaredAnnotationsByType(类<T> annotationClass)
如果此类注释 直接存在或 间接存在 ,则返回指定类型的此元素的注释。boolean
isAccessible()
已过时。不推荐使用此方法,因为它的名称暗示它在实际指示是否抑制了对Java语言访问控制的检查时检查反射对象是否可访问。boolean
isAnnotationPresent(类<? extends Annotation> annotationClass)
如果此元素上 存在指定类型的注释,则返回true,否则返回false。void
setAccessible(boolean flag)
将此反射对象的accessible
标志设置为指示的布尔值。static void
setAccessible(AccessibleObject[] array, boolean flag)
通过单个安全检查为效率设置反射对象数组的accessible
标志的便捷方法(为了提高效率)。boolean
trySetAccessible()
设置accessible
标志这反映了反对true
如果可能的话。
-
-
-
方法详细信息
-
setAccessible
public static void setAccessible(AccessibleObject[] array, boolean flag)
通过单个安全检查为效率设置反射对象数组的accessible
标志的便捷方法(为了提高效率)。当可以按照
setAccessible(boolean)
的规定启用对每个反射对象的访问时,此方法可用于访问阵列中的所有反射对象。如果有安全管理器,则首先使用
ReflectPermission("suppressAccessChecks")
权限调用其checkPermission
方法。甲
SecurityException
如果任何输入的元件的也被抛出array
是构造器
对象为类java.lang.Class
和flag
是真实的。- 参数
-
array
- AccessibleObjects数组 -
flag
- 每个对象中accessible
标志的新值 - 异常
-
InaccessibleObjectException
- 如果无法为阵列中的所有对象启用访问权限 -
SecurityException
- 如果安全管理器拒绝请求,或者数组中的元素是java.lang.Class
的构造java.lang.Class
- 另请参见:
-
SecurityManager.checkPermission(java.security.Permission)
,ReflectPermission
-
setAccessible
public void setAccessible(boolean flag)
将此反射对象的accessible
标志设置为指示的布尔值。 值true
表示反射对象在使用时应禁止检查Java语言访问控制。 值false
表示反射对象在使用时应强制检查Java语言访问控制,并在类描述中注明变体。类
C
的调用者可以使用此方法来访问member
的declaring class
D
如果满足以下任何条件:-
C
和D
在同一模块中。 - 该成员是
public
和D
是public
在一个包中,该模块包含D
输出
至少包含C
的模块。 - 所述构件是
protected
static
,D
是public
在于包含模块的封装D
出口到至少包含模块C
,和C
是的一个子类D
。 -
D
在一个包中,该模块包含D
opens
至少包含C
的模块。 未命名和打开模块中的所有软件包都对所有模块开放,因此当D
位于未命名或打开的模块中时,此方法始终成功。
当声明类与调用者位于不同的模块且包含声明类的包未打开时,此方法不能用于启用对私有成员,具有默认(包)访问的成员,受保护的实例成员或受保护的构造函数的访问来电者的模块。
如果有安全管理器,则首先使用
ReflectPermission("suppressAccessChecks")
权限调用其checkPermission
方法。- 参数
-
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
一个关于方法
对象私有实例方法p.T::privateMethod
的时候打压Java语言访问控制检查方法
被调用。 如果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 ... }
如果有安全管理器,则首先使用
ReflectPermission("suppressAccessChecks")
权限调用其checkPermission
方法。- 结果
-
true
如果accessible
标志设置为true
;false
如果无法启用访问权限。 - 异常
-
SecurityException
- 如果安全管理器拒绝请求 - 从以下版本开始:
- 9
- 另请参见:
-
MethodHandles.privateLookupIn(java.lang.Class<?>, java.lang.invoke.MethodHandles.Lookup)
-
isAccessible
@Deprecated(since="9")public boolean isAccessible()
Deprecated.This method is deprecated because its name hints that it checks if the reflected object is accessible when it actually indicates if the checks for Java language access control are suppressed. This method may returnfalse
on a reflected object that is accessible to the caller. To test if this reflected object is accessible, it should usecanAccess(Object)
.获取此反射对象的accessible
标志的值。- 结果
- 对象的
accessible
标志的值
-
canAccess
public final boolean canAccess(Object obj)
测试调用者是否可以访问此反射对象。 如果此反射对象对应于实例方法或字段,则此方法测试调用者是否可以使用反射对象访问给定的obj
。 对于实例方法或字段则obj
参数必须是实例declaring class
。 对于静态成员和构造函数,则obj
必须为null
。如果
accessible
标志设置为true
,则此方法返回true
,即抑制Java语言访问控制的检查,或者如果调用者可以访问The Java™ Language Specification中指定的成员,并且类描述中记录了变体。- 参数
-
obj
- 此反射对象的声明类的实例对象(如果它是实例方法或字段) - 结果
-
true
如果调用者可以访问此反射对象。 - 异常
-
IllegalArgumentException
-- 如果此反射对象是静态成员或构造函数,并且给定的
obj
是非null
,或者 - 如果此反射对象是实例方法或字段,并且给定的
obj
是null
或者类型不是该成员的declaring class
的子类。
- 如果此反射对象是静态成员或构造函数,并且给定的
- 从以下版本开始:
- 9
- 另请参见:
-
trySetAccessible()
,setAccessible(boolean)
- See The Java™ Language Specification:
- 6.6访问控制
-
getAnnotation
public <T extends Annotation> T getAnnotation(类<T> annotationClass)
从界面复制的说明:AnnotatedElement
返回该元素的,如果这样的注释 ,否则返回null指定类型的注释。- Specified by:
-
getAnnotation
在AnnotatedElement
- 参数类型
-
T
- 要查询的注释的类型,如果存在则返回 - 参数
-
annotationClass
- 与注释类型对应的Class对象 - 结果
- 如果此元素上存在指定注释类型,则此元素的注释,否则为null
- 异常
-
NullPointerException
- 如果给定的注释类为null - 从以下版本开始:
- 1.5
-
isAnnotationPresent
public boolean isAnnotationPresent(类<? extends Annotation> annotationClass)
如果此元素上存在指定类型的注释,则返回true,否则返回false。 此方法主要用于方便地访问标记注释。此方法返回的真值等价于:
getAnnotation(annotationClass) != null
默认方法的主体被指定为上面的代码。
- Specified by:
-
isAnnotationPresent
在界面AnnotatedElement
- 参数
-
annotationClass
- 与注释类型对应的Class对象 - 结果
- 如果此元素上存在指定注释类型的注释,则返回true,否则返回false
- 异常
-
NullPointerException
- 如果给定的注释类为null - 从以下版本开始:
- 1.5
-
getAnnotationsByType
public <T extends Annotation> T[] getAnnotationsByType(类<T> annotationClass)
从界面复制的说明:AnnotatedElement
返回与此元素关联的注释。 如果没有与此元素关联的注释,则返回值是长度为0的数组。此方法与AnnotatedElement.getAnnotation(Class)
之间的区别在于此方法检测其参数是否为可重复注释类型 (JLS 9.6),如果是,则尝试通过“查看”容器注释来查找该类型的一个或多个注释。 此方法的调用者可以自由修改返回的数组; 它对返回给其他调用者的数组没有影响。- Specified by:
-
getAnnotationsByType
在接口AnnotatedElement
- 参数类型
-
T
- 要查询的注释的类型,如果存在则返回 - 参数
-
annotationClass
- 与注释类型对应的Class对象 - 结果
- 如果与此元素关联,则指定注释类型的所有此元素的注释,否则为长度为零的数组
- 异常
-
NullPointerException
- 如果给定的注释类为null - 从以下版本开始:
- 1.8
-
getAnnotations
public Annotation[] getAnnotations()
从界面复制的说明:AnnotatedElement
返回此元素上存在的注释。 如果没有存在于此元素上注解,返回值是长度为0这种方法的调用者可以随意修改返回的数组的数组; 它对返回给其他调用者的数组没有影响。- Specified by:
-
getAnnotations
在接口AnnotatedElement
- 结果
- 此元素上的注释
- 从以下版本开始:
- 1.5
-
getDeclaredAnnotation
public <T extends Annotation> T getDeclaredAnnotation(类<T> annotationClass)
从界面复制的说明:AnnotatedElement
如果直接存在这样的注释,则返回指定类型的此元素的注释,否则返回null。 此方法忽略继承的注释。 (如果此元素上没有直接出现注释,则返回null。)- Specified by:
-
getDeclaredAnnotation
在界面AnnotatedElement
- 参数类型
-
T
- 要查询的注释的类型,如果直接存在则返回 - 参数
-
annotationClass
- 与注释类型对应的Class对象 - 结果
- 如果直接出现在此元素上,则此元素的指定注释类型的注释,否则为null
- 异常
-
NullPointerException
- 如果给定的注释类为null - 从以下版本开始:
- 1.8
-
getDeclaredAnnotationsByType
public <T extends Annotation> T[] getDeclaredAnnotationsByType(类<T> annotationClass)
从界面复制的说明:AnnotatedElement
如果此类注释直接存在或间接存在 ,则返回指定类型的此元素的注释。 此方法忽略继承的注释。 如果此元素上没有直接或间接存在的指定注释,则返回值为长度为0的数组。此方法与AnnotatedElement.getDeclaredAnnotation(Class)
之间的区别在于此方法检测其参数是否为可重复注释类型 (JLS 9.6),并且如果是,则尝试通过“查看”容器注释(例如,如果存在)来查找该类型的一个或多个注释。 此方法的调用者可以自由修改返回的数组; 它对返回给其他调用者的数组没有影响。- Specified by:
-
getDeclaredAnnotationsByType
在界面AnnotatedElement
- 参数类型
-
T
- 要查询的注释的类型,如果直接或间接存在则返回 - 参数
-
annotationClass
- 与注释类型对应的Class对象 - 结果
- 如果直接或间接出现在此元素上,则指定注释类型的所有此元素的注释,否则为长度为零的数组
- 异常
-
NullPointerException
- 如果给定的注释类为null - 从以下版本开始:
- 1.8
-
getDeclaredAnnotations
public Annotation[] getDeclaredAnnotations()
从界面复制的说明:AnnotatedElement
返回直接出现在此元素上的注释。 此方法忽略继承的注释。 如果此元素上没有直接存在注释,则返回值为长度为0的数组。此方法的调用者可以自由修改返回的数组; 它对返回给其他调用者的数组没有影响。- Specified by:
-
getDeclaredAnnotations
在接口AnnotatedElement
- 结果
- 注释直接出现在此元素上
- 从以下版本开始:
- 1.5
-
-