- java.lang.Object
-
- java.lang.reflect.AccessibleObject
-
- All Implemented Interfaces:
-
AnnotatedElement
- 已知直接子类:
-
Executable
,Field
public class AccessibleObject extends Object implements AnnotatedElement
所述AccessibleObject
类是基础类Field
,方法
,和Constructor
对象(被称为反射的对象 )。 它可以将反射对象标记为在使用Java语言访问控制时抑制检查。 这允许具有足够权限的复杂应用程序(例如Java对象序列化或其他持久性机制)以通常被禁止的方式操纵对象。Java语言访问控制防止在其课外使用私人成员; 包裹访问成员在包装外; 受保护的成员在其包或子类之外; 和公共成员之外的模块,除非它们被声明在一个
exported
包和用户reads
他们的模块。 默认情况下,当Field
s,方法
s或Constructor
用于获取或设置字段,调用方法或分别创建和初始化新的实例时,Java语言访问控制将被强制执行(有一个变体)。 每个反射对象检查使用它的代码是否在适当的类,包或模块中。Java语言访问控制的一个变体是反射对象的检查是可读性的。 也就是说,假设使用反射对象的模块读取其中声明了基础字段,方法或构造函数的模块。
是否可以抑制对Java语言访问控制的检查(从而可以启用访问)取决于反射对象是否对应于导出或打开的包中的成员(请参阅
setAccessible(boolean)
)。- 从以下版本开始:
- 1.2
- See The Java™ Language Specification:
- 6.6访问控制
-
-
构造方法摘要
构造方法 Modifier Constructor 描述 protected
AccessibleObject()
构造函数:仅由Java虚拟机使用。
-
方法摘要
所有方法 静态方法 接口方法 具体的方法 弃用的方法 Modifier and Type 方法 描述 boolean
canAccess(Object obj)
测试调用者是否可以访问此反射对象。<T extends Annotation>
TgetAnnotation(Class<T> annotationClass)
返回该元素的,如果这样的注释 ,否则返回null指定类型的注释。Annotation[]
getAnnotations()
返回此元素上 存在的注释。<T extends Annotation>
T[]getAnnotationsByType(Class<T> annotationClass)
返回与此元素 相关联的注释。<T extends Annotation>
TgetDeclaredAnnotation(Class<T> annotationClass)
如果这样的注释 直接存在 ,则返回指定类型的元素注释,否则返回null。Annotation[]
getDeclaredAnnotations()
返回 直接存在于此元素上的注释。<T extends Annotation>
T[]getDeclaredAnnotationsByType(Class<T> annotationClass)
如果此类注释 直接存在或 间接存在,则返回该元素的注释(指定类型)。boolean
isAccessible()
已过时。此方法已被弃用,因为它的名称提示它检查反射对象是否可访问,当它实际指示是否抑制对Java语言访问控制的检查。 此方法可能会在调用者可访问的反射对象上返回false
。 要测试此反射对象是否可访问,应使用canAccess(Object)
。boolean
isAnnotationPresent(Class<? 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)
指定可以启用对每个反射对象的访问时,此方法可用于启用对阵列中所有反射对象的访问。如果有一个安全管理器,它的
checkPermission
方法首先被调用一个ReflectPermission("suppressAccessChecks")
权限。如果输入
array
任何元素是java.lang.Class
和flag
类的Constructor
对象,则也抛出ASecurityException
。- 参数
-
array
- AccessibleObjects的数组 -
flag
- 每个对象中的accessible
标志的新值 - 异常
-
InaccessibleObjectException
- 如果无法为阵列中的所有对象启用访问权限 -
SecurityException
- 如果请求被安全管理器拒绝,或者阵列中的元素是一个构造函数,用于java.lang.Class
- 另请参见:
-
SecurityManager.checkPermission(java.security.Permission)
,ReflectPermission
-
setAccessible
public void setAccessible(boolean flag)
将此反射对象的accessible
标志设置为指示的布尔值。 值为true
表示反射对象应该在使用Java语言访问控制时抑制检查。 值为false
表示反射对象应该在使用Java语言访问控制时执行检查,并在类描述中注明变体。呼叫者可以使用该方法在类别
C
中启用declaring class
DD
访问,如果以下任何一项保持:-
C
和D
在相同的模块中。 - 所述构件是
public
和D
是public
在于包含模块的封装D
exports
到至少包含模块C
。 - 所述构件是
protected
static
,D
是public
在于包含模块的封装D
出口到至少包含模块C
,和C
是的一个子类D
。 -
D
是在一个包中,模块包含D
opens
至少包含C
的模块。 未命名和开放模块中的所有软件包均可对所有模块开放,因此当D
处于未命名或打开模块时,此方法始终会成功。
当声明类与调用者不同的模块时,此方法不能用于启用对私有成员,具有默认(包)访问权限的成员,受保护的实例成员或受保护的构造函数的访问,并且包含声明类的包不能打开呼叫者的模块。
如果有一个安全管理员,它的
checkPermission
方法首先被调用一个ReflectPermission("suppressAccessChecks")
权限。- 参数
-
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 ... }
如果有一个安全管理员,它的
checkPermission
方法首先被调用了一个ReflectPermission("suppressAccessChecks")
权限。- 结果
-
true
如果accessible
标志设置为true
;false
如果无法启用访问。 - 异常
-
SecurityException
- 如果请求被安全管理器拒绝 - 从以下版本开始:
- 9
- 另请参见:
-
MethodHandles.privateLookupIn(java.lang.Class<?>, java.lang.invoke.MethodHandles.Lookup)
-
isAccessible
@Deprecated(since="9") public boolean isAccessible()
已过时。 此方法已被弃用,因为它的名称提示它检查反射对象是否可访问,当它实际指示是否抑制对Java语言访问控制的检查。 此方法可能会在调用者可访问的反射对象上返回false
。 要测试此反射对象是否可访问,应使用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
,或 - 如果这个反映的对象是一个实例方法或字段,给定的
obj
是null
或类型,不是该成员的declaring class
的子类。
- 如果该反映的对象是静态成员或构造函数,并且给定的
- 从以下版本开始:
- 9
- 另请参见:
-
trySetAccessible()
,setAccessible(boolean)
- See The Java™ Language Specification:
- 6.6访问控制
-
getAnnotation
public <T extends Annotation> T getAnnotation(Class<T> annotationClass)
描述从接口AnnotatedElement
复制返回该元素的,如果这样的注释 ,否则返回null指定类型的注释。- Specified by:
-
getAnnotation
在接口AnnotatedElement
- 参数类型
-
T
- 要查询的注释的类型,如果存在则返回 - 参数
-
annotationClass
- 对应于注释类型的Class对象 - 结果
- 该元素的注释指定的注释类型,如果存在于此元素,否则为null
- 异常
-
NullPointerException
- 如果给定的注释类为空 - 从以下版本开始:
- 1.5
-
isAnnotationPresent
public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)
如果此元素上存在指定类型的注释,则返回true,否则返回false。 该方法主要用于方便访问标记注释。该方法返回的真值等价于:
getAnnotation(annotationClass) != null
默认方法的主体被指定为上述代码。
- Specified by:
-
isAnnotationPresent
在接口AnnotatedElement
- 参数
-
annotationClass
- 对应于注释类型的Class对象 - 结果
- 如果此元素上存在指定注释类型的注释,则为true,否则为false
- 异常
-
NullPointerException
- 如果给定的注释类为空 - 从以下版本开始:
- 1.5
-
getAnnotationsByType
public <T extends Annotation> T[] getAnnotationsByType(Class<T> annotationClass)
说明从接口AnnotatedElement
复制返回与此元素相关联的注释。 如果没有与此元素相关联的注释,则返回值为长度为0.的数组。此方法与AnnotatedElement.getAnnotation(Class)
之间的区别在于该方法检测其参数是否为可重复注释类型 (JLS 9.6),如果是,则尝试通过“查看”容器注释来查找该类型的一个或多个注释。 该方法的调用者可以自由修改返回的数组; 它将对返回给其他调用者的数组没有影响。- Specified by:
-
getAnnotationsByType
在接口AnnotatedElement
- 参数类型
-
T
- 要查询的注释的类型,如果存在则返回 - 参数
-
annotationClass
- 对应于注释类型的Class对象 - 结果
- 如果与此元素相关联,则指定注释类型的所有元素注释,否则为长度为零的数组
- 异常
-
NullPointerException
- 如果给定的注释类为空 - 从以下版本开始:
- 1.8
-
getAnnotations
public Annotation[] getAnnotations()
描述从接口AnnotatedElement
复制返回此元素上存在的注释。 如果没有存在于此元素上注解,返回值是长度为0这种方法的调用者可以随意修改返回的数组的数组; 它将对返回给其他调用者的数组没有影响。- Specified by:
-
getAnnotations
在接口AnnotatedElement
- 结果
- 此元素上出现的注释
- 从以下版本开始:
- 1.5
-
getDeclaredAnnotation
public <T extends Annotation> T getDeclaredAnnotation(Class<T> annotationClass)
说明从接口AnnotatedElement
复制如果这样的注释直接存在 ,则返回指定类型的元素注释,否则返回null。 此方法忽略继承的注释。 (如果此元素上没有注释,则返回null)- Specified by:
-
getDeclaredAnnotation
在接口AnnotatedElement
- 参数类型
-
T
- 查询的注释类型,如果直接出现则返回 - 参数
-
annotationClass
- 对应于注释类型的Class对象 - 结果
- 如果直接出现在该元素上,则指定注释类型的元素注释,否则为null
- 异常
-
NullPointerException
- 如果给定的注释类为空 - 从以下版本开始:
- 1.8
-
getDeclaredAnnotationsByType
public <T extends Annotation> T[] getDeclaredAnnotationsByType(Class<T> annotationClass)
说明从接口AnnotatedElement
复制如果此类注释直接存在或间接存在,则返回该元素的注释(指定类型)。 此方法忽略继承的注释。 如果此元素上没有直接或间接出现的指定注释,则返回值为长度为0的数组。此方法与AnnotatedElement.getDeclaredAnnotation(Class)
之间的区别在于该方法检测其参数是否是可重复注释类型 (JLS 9.6),以及如果是,尝试通过“查看”容器注释(如果存在)来查找该类型的一个或多个注释。 该方法的调用者可以自由修改返回的数组; 它将对返回给其他调用者的数组没有影响。- Specified by:
-
getDeclaredAnnotationsByType
在接口AnnotatedElement
- 参数类型
-
T
- 直接或间接出现的查询和返回的注释类型 - 参数
-
annotationClass
- 对应于注释类型的Class对象 - 结果
- 指定注释类型的所有这些元素的注释,如果直接或间接地存在于该元素上,否则为长度为零的数组
- 异常
-
NullPointerException
- 如果给定的注释类为空 - 从以下版本开始:
- 1.8
-
getDeclaredAnnotations
public Annotation[] getDeclaredAnnotations()
说明从界面AnnotatedElement
复制返回直接存在于此元素上的注释。 此方法忽略继承的注释。 如果此元素上没有直接显示的注释,则返回值为长度为0的数组。此方法的调用者可以自由修改返回的数组; 它将对返回给其他调用者的数组没有影响。- Specified by:
-
getDeclaredAnnotations
在接口AnnotatedElement
- 结果
- 此元素上直接显示的注释
- 从以下版本开始:
- 1.5
-
-