Class对象 和 java反射 AccessibleObject 类 和注解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/feicongcong/article/details/84829590

java 反射机制:在程序中获取已加载到jvm中的java对象的信息,并检测或修改

获取构造器

获取成员变量

获取方法

明显 Accessible并不是标识方法能否访问的. public的方法 Accessible仍为false 
使用了method.setAccessible(true)后 性能有了20倍的提升
Accessable属性是继承自AccessibleObject 类. 功能是启用或禁用安全检查

JDK API中的解释
引用
AccessibleObject 类是 Field、Method 和 Constructor 对象的基类。它提供了将反射的对象标记为在使用时取消默认 Java 语言访问控制检查的能力。对于公共成员、默认(打包)访问成员、受保护成员和私有成员,在分别使用 Field、Method 或 Constructor 对象来设置或获得字段、调用方法,或者创建和初始化类的新实例的时候,会执行访问检查。
在反射对象中设置 accessible 标志允许具有足够特权的复杂应用程序(比如 Java Object Serialization 或其他持久性机制)以某种通常禁止使用的方式来操作对象。
setAccessible 
public void setAccessible(boolean flag) 
                   throws SecurityException 
将此对象的 accessible 标志设置为指示的布尔值。值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。值为 false 则指示反射的对象应该实施 Java 语言访问检查。
实际上setAccessible是启用和禁用访问安全检查的开关,并不是为true就能访问为false就不能访问

jdk5后增加Annotation .改功能用于类,构造方法,成员变量,方法,参数等的声明

public class AccessibleObject extends Object implements AnnotatedElement

AccessibleObject 类实现了AnnotatedElement,它是 Field、Method 和 Constructor 对象的基类。它提供了将反射的对象标记为在使用时取消默认 Java 语言访问控制检查的能力。对于公共成员、默认(打包)访问成员、受保护成员和私有成员,在分别使用 Field、Method 或 Constructor 对象来设置或获得字段、调用方法,或者创建和初始化类的新实例的时候,会执行访问检查。
AccessibleObject :的方法:
isAccessible:
public boolean isAccessible()获得此对象的 accessible 标志的值。
此对象的返回值 就是accessible的标志值,一般情况下无论 public,private,protected,默认等修饰的属性的access值均为false(注意他的意思并非是访问权限而是对该自己执行安全检查)。
setAccessible:
public static void setAccessible(object , boolean flag)
throws SecurityException使用单一安全性检查(为了提高效率)为一对象设置 accessible 标志。如果存在安全管理器,则在 ReflectPermission("suppressAccessChecks") 权限下调用 checkPermission 方法。当flag 为 true,表示不开启安全检查,但是不能更改输入 object的任何元素的可访问性(例如,如果元素对象是 Class 类的 Constructor 对象),则会引发 SecurityException。如果发生 SecurityException,对于少于(不包括)发生异常的元素的数组元素,可以将对象的可访问性设置为 flag;对于超出(包括)引发异常的元素的那些元素,则不更改其可访问性.

getAnnotation
public <T extends Annotation> T getAnnotation(Class<T> annotationClass)从接口 AnnotatedElement 复制的描述 .如果存在该元素的指定类型的注释,则返回这些注释,否则返回 null。
指定者:接口 AnnotatedElement 中的 getAnnotation
参数: annotationClass - 对应于注释类型的 Class 对象
返回:如果该元素的指定注释类型的注释存在于此对象上,则返回这些注释,否则返回 null
isAnnotationPresent
public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)
从接口 AnnotatedElement 复制的描述 ,如果指定类型的注释存在于此元素上,则返回 true,否则返回 false。此方法主要是为了便于访问标记注释而设计的。
指定者:接口 AnnotatedElement 中的 isAnnotationPresent
参数:annotationClass - 对应于注释类型的 Class 对象
返回:如果指定注释类型的注释存在于此对象上,则返回 true,否则返回 false
getAnnotation
public Annotation[] getAnnotations()从接口 AnnotatedElement 复制的描述 ,返回此元素上存在的所有注释。(如果此元素没有注释,则返回长度为零的数组。)该方法的调用方可以随意修改返回的数组;这不会对其他调用方返回的数组产生任何影响。 指定者:接口 AnnotatedElement 中的 getAnnotations
返回: 此元素上存在的所有注释
getDeclaredAnnotation
public Annotation[] getDeclaredAnnotations()从接口 AnnotatedElement 复制的描述 返回直接存在于此元素上的所有注释。与此接口中的其他方法不同,该方法将忽略继承的注释。(如果没有注释直接存在于此元素上,则返回长度为零的一个数组。)该方法的调用方可以随意修改返回的数组;这不会对其他调用方返回的数组产生任何影响。
指定者: 接口 AnnotatedElement 中的 getDeclaredAnnotations
返回: 直接存在于此元素上的所有注释
 

猜你喜欢

转载自blog.csdn.net/feicongcong/article/details/84829590