文章目录
1、 认识Annotation
jdk1.5开始,java 增加了对元素据(类的组成单元数据)的支持,也就是注解, 它是代码里做的特殊标记,这些标记可以在编译,类加载,运行时在不改变原有逻辑的情况下,被读取,并执行相应的处理,通过使用Annotation,程序员可以在源文件中嵌入一些补充的信息。代码分析工具,开发工具和部署工具可以通过这些补充信息进行验证或者部署。Annotation 类似于修饰符一样被使用,可以用于包,类,构造方法,方法,成员变量,参数,局部变量的声明
Annotation 是一个接口
2、系统定义的Annotation
系统提供了三个方法 @Override, @Deprecated, @SuppressWarnings
@Override 表示当前的方法定义将覆盖超类中的方法,如果不小心拼写错误,或者方法签名对不上被覆盖的方法,编译器就会发出错误的提示
@Deprecated 表示一个类或方法已经不建议继续使用了,标记为已过时
@SuppressWarnings 表示关闭不当的编译器警告信息
3、自定义Annotation
三个步骤:
- 编写注解
- 在类上应用注解
- 对应用了注解的类进行反射操作
自定义Annotation的语法: public @interface MyAnnotation{}
在Annotation 中定义变量
public @interface MyAnnotation{
public String name();
public String info();
}
定义变量后,在调用此Annotation 时必须设置变量值
@MyAnnotation( name="vince", info="hello")
public class Demo{
}
通过default 指定变量默认值
有了默认值在使用时可以不设值
public @interface MyAnnotation{
public String name() default "vince";
public String info() default "hello";
}
定义一个变量的数组,接收一组参数
public @interface MyAnnotation{
public String[] name();
}
使用时指定数组值
@MyAnnotation(name = {"jack","vince"})
public class Demo{
}
使用枚举限制变量的取值范围
public enum Color{
RED,GREEN,BLUE
}
public @interface MyAnnotation{
public Color color();
}
4、Retention 和RetentionPolicy
Annotation 要想决定其作用的范围,通过@Retention指定
范围 | 描述 |
---|---|
public static final RetentionPolicy SOURCE | 在java 源程序中存在 |
public static final RetentionPolicy CLASS | 在java生成的class 中存在 |
public static final RetentionPolicy RUNTIME | 在java 运行的时候存在 |
@Retention(value="RetentionPolucy.RUNTIME")
public @interface MyAnnotation{
public String name();
}
5、 反射与Annotation
一个Annotation 真正起作用,必须结合反射机制,在反射中提供了以下的操作方法:
java.lang.reflect.AccessibleObject
方法名称 | 描述 |
---|---|
public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) | 判断是否是指定的Annotation |
public Annotaion[] getAnnotations() | 得到全部Annotation |
6、 @Documented 注解
此注解表示的是文档化,可以和生成doc文档的时候添加注解
7、 @Target 注解
表示一个Annotation的使用范围,之前定义的MyAnnotation可以在任意位置上使用
范围 | 描述 |
---|---|
public static final ElementType Type | 只能在类或接口或枚举上使用 |
public static final ElementType FIELD | 在成员变量使用 |
public static final ElementType METHOD | 在方法中使用 |
public static final ElementType PARAMETER | 在参数上使用 |
public static final ElementType CONSTRUCTOR | 在构造方法中使用 |
public static final ElementType LOCAL_VARIABLE | 局部变量上使用 |
public static final ElementType ANNOTATION_TYPE | 只能在Annotation中使用 |
public static final ElementType PACKAGE | 只能在包中使用 |
8、 @Inherited 注解
表示一个Annotation是否允许被其他子类继承下来