认知:
注解其实就是一种标记,可以在程序代码中的关键节点(类、方法、变量、参数、包)上打上这些标记,然后程序在编译时或运行时可以检测到这些标记从而执行一些特殊操作。
步骤:
第一步,定义注解——相当于定义标记;
第二步,配置注解——把标记打在需要用到的程序代码中;
第三步,解析注解——在编译期或运行时检测到标记,并进行特殊操作。
常用的元注解:
@Target : 目的地,就是用在哪里
值:枚举类:ElementType
- /** 类,接口(包括注解类型)或枚举的声明 **/
TYPE, - /** 属性的声明 **/
FIELD, - /** 方法的声明 **/
METHOD, - /** 方法形式参数声明 **/
PARAMETER, - /** 构造方法的声明 **/
CONSTRUCTOR, - /** 局部变量声明 **/
LOCAL_VARIABLE, - /** 注解类型声明 **/
ANNOTATION_TYPE, - /** 包的声明 **/
PACKAGE - /** Type parameter declaration @since 1.8 **/
TYPE_PARAMETER, - /** Use of a type @since 1.8 */
TYPE_USE
@Retention: 目持久力,用来修饰自定义注解的生命力
值:枚举类:RetentionPolicy
//Annotations are to be discarded by the compiler.
//(注解将被编译器忽略掉)和一个注释是一样的效果
SOURCE,
//Annotations are to be recorded in the class file by the compiler,but need not be retained by the VM at run time. This is the default, behavior.
//(注解将被编译器记录在class文件中,但在运行时不会被虚拟机保留,这是一个默认的行为)
CLASS,
//Annotations are to be recorded in the class file by the compiler and retained by the VM at run time, so they may be read reflectively.
//(注解将被编译器记录在class文件中,而且在运行时会被虚拟机保留,因此它们能通过反射被读取到)
// 这个注解可以在运行期的加载阶段被加载到Class对象中。
// 那么在程序运行阶段,我们可以通过反射得到这个注解,
// 并通过判断是否有这个注解或这个注解中属性的值,从而执行不同的程序代码段
//@see java.lang.reflect.AnnotatedElement
RUNTIME
- @Documented
指定自定义注解是否能随着被定义的java文件生成到JavaDoc文档当中
-
@Inherited
继承,是指定某个自定义注解如果写在了父类的声明部分,那么子类的声明部分也能自动拥有该注解。
-
@Inherited
注解只对那些@Target被定义为ElementType.TYPE的自定义注解起作用
如果我们要获得的注解是配置在方法上的,那么我们要从Method对象上获取;
如果是配置在属性上,就需要从该属性对应的Field对象上去获取,
如果是配置在类型上,需要从Class对象上去获取。
总之在谁身上,就从谁身上去获取!
isAnnotationPresent(Class<? extends Annotation> annotationClass)方法是专门判断该元素上是否配置有某个指定的注解;
getAnnotation(Class annotationClass)方法是获取该元素上指定的注解。之后再调用该注解的注解类型元素方法就可以获得配置时的值数据;
反射对象上还有一个方法getAnnotations(),该方法可以获得该对象身上配置的所有的注解。它会返回给我们一个注解数组,需要注意的是该数组的类型是Annotation类型,这个Annotation是一个来自于java.lang.annotation包的接口。
引用博主:cherry-peng

310

被折叠的 条评论
为什么被折叠?



