模块  java.base
软件包  java.lang.reflect

Class 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访问控制
    • 构造方法详细信息

      • AccessibleObject

        protected AccessibleObject()
        构造函数:仅供Java虚拟机使用。
    • 方法详细信息

      • setAccessible

        public static void setAccessible​(AccessibleObject[] array,
                                         boolean flag)
        通过单个安全检查为效率设置反射对象数组的accessible标志的便捷方法(为了提高效率)。

        当可以按照setAccessible(boolean)规定启用对每个反射对象的访问时,此方法可用于访问阵列中的所有反射对象。

        如果有安全管理器,则首先使用ReflectPermission("suppressAccessChecks")权限调用其checkPermission方法。

        SecurityException如果任何输入的元件的也被抛出array构造器对象为类java.lang.Classflag是真实的。

        参数
        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的调用者可以使用此方法来访问memberdeclaring class D如果满足以下任何条件:

        • CD在同一模块中。
        • 该成员是publicDpublic在一个包中,该模块包含D 输出至少包含C的模块。
        • 所述构件是protected staticDpublic在于包含模块的封装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 return false on a reflected object that is accessible to the caller. To test if this reflected object is accessible, it should use canAccess(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 ,或者
        • 如果此反射对象是实例方法或字段,并且给定的objnull或者类型不是该成员的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:
        getAnnotationAnnotatedElement
        参数类型
        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