大纲
类之间的关系
相关的类
Annotation.java
package java.lang.annotation;
public interface Annotation {
boolean equals(Object obj);
int hashCode();
String toString();
Class<? extends Annotation> annotationType();
}
ElementType.java
枚举类
package java.lang.annotation;
public enum ElementType {
TYPE, /* 类、接口(包括注释类型)或枚举声明 */
FIELD, /* 字段声明(包括枚举常量) */
METHOD, /* 方法声明 */
PARAMETER, /* 参数声明 */
CONSTRUCTOR, /* 构造方法声明 */
LOCAL_VARIABLE, /* 局部变量声明 */
ANNOTATION_TYPE, /* 注释类型声明 */
PACKAGE /* 包声明 */
}
RetentionPolicy.java
枚举类
package java.lang.annotation;
public enum RetentionPolicy {
SOURCE, /* Annotation信息仅存在于编译器处理期间,编译器处理完之后就没有该Annotation信息了 */
CLASS, /* 编译器将Annotation存储于类对应的.class文件中。默认行为 */
RUNTIME /* 编译器将Annotation存储于class文件中,并且可由JVM读入 */
}
自定义Annotation
在注解中可以定义变量,当使用到该注解时,可以对变量进行赋值。
package com.ruanwenfu;
import java.lang.annotation.*;
@Documented
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
}
@Documented
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String value1() default "abc";
}
//当使用注解时
@MyAnnotation(value1="a")
当注解中使用的属性名为value时,对其赋值时可以不指定属性的名称而直接写上属性值接口;除了value以外的变量名都需要使用name=value的方式进行赋值
@interfact
定义注解时必须的写法,标识当前接口实现了java.lang.annotation.Annotation接口,是一个Annotation
@Documented
类和方法的Annotation在缺省情况下是不会出现在javadoc中的,如果使用了@Documented修饰了Annotation,表示这个注解可以出现在javadoc中
@Target(ElementType.TYPE)
说明该注解只能用来修饰类,接口(包括注释类型)或枚举声明
如果没有@Target的话,该注解可以用来任何地方
@Retention(RetensionPolicy.RUNTIME)
这意味着编译器会将该Annotation信息保留在字节码.class文件中,并且在运行时可以被虚拟机读取。
Annotation的作用
1)编译检查
让编译器进行编译检查的作用,例如@SuppressWarning和@Deprecated
2)在反射中可以使用Annotation
在与反射相关的方法中,我们能够获取到定义在类,方法,属性上的注解。
3)根据Annotation生成帮助文档
在Annotation注解上加上@Documented标签,使该Annotation标签出现在javadoc中
4)能够帮助查看代码
通过@Override @Deprecated来帮助阅读代码