- java.lang.Object
-
- java.lang.reflect.AccessibleObject
-
- 实现的所有接口
-
AnnotatedElement
- 已知直接子类:
-
Executable,字段
public class AccessibleObject extends Object implements AnnotatedElement
所述AccessibleObject类是基础类字段,方法,和构造器对象(被称为反射的对象 )。 它提供了将反射对象标记为在使用时禁止检查Java语言访问控制的功能。 这允许具有足够权限的复杂应用程序(例如Java对象序列化或其他持久性机制)以通常被禁止的方式操纵对象。Java语言访问控制可防止在顶级类之外使用私有成员; 包裹访问成员在他们的包裹外; 受保护的成员在他们的包或子类之外; 除非在
exported程序包和用户reads中声明其模块,否则模块外的公共成员。 默认情况下,当字段s,方法s或构造器用于获取或设置字段,调用方法或创建和初始化类的新实例时,将强制执行Java语言访问控制(使用一种变体)。 每个反射对象都会检查使用它的代码是否在适当的类,包或模块中。Java语言访问控制的一个变体是反射对象的检查假定可读性。 也就是说,假定包含使用反射对象的模块读取声明了基础字段,方法或构造函数的模块。
是否可以抑制对Java语言访问控制的检查(因此,是否可以启用访问)取决于反射对象是否对应于导出或打开包中的成员(请参阅
setAccessible(boolean))。- 从以下版本开始:
- 1.2
- See The Java™ Language Specification:
- 6.6访问控制
-
-
构造方法摘要
构造方法 变量 构造器 描述 protectedAccessibleObject()构造函数:仅供Java虚拟机使用。
-
方法摘要
所有方法 静态方法 实例方法 具体的方法 弃用的方法 变量和类型 方法 描述 booleancanAccess(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)如果此类注释 直接存在或 间接存在 ,则返回指定类型的此元素的注释。booleanisAccessible()已过时。不推荐使用此方法,因为它的名称暗示它在实际指示是否抑制了对Java语言访问控制的检查时检查反射对象是否可访问。booleanisAnnotationPresent(类<? extends Annotation> annotationClass)如果此元素上 存在指定类型的注释,则返回true,否则返回false。voidsetAccessible(boolean flag)将此反射对象的accessible标志设置为指示的布尔值。static voidsetAccessible(AccessibleObject[] array, boolean flag)通过单个安全检查为效率设置反射对象数组的accessible标志的便捷方法(为了提高效率)。booleantrySetAccessible()设置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 classD如果满足以下任何条件:-
C和D在同一模块中。 - 该成员是
public和D是public在一个包中,该模块包含D输出至少包含C的模块。 - 所述构件是
protectedstatic,D是public在于包含模块的封装D出口到至少包含模块C,和C是的一个子类D。 -
D在一个包中,该模块包含Dopens至少包含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 returnfalseon 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
-
-