注解
注解分为标准注解和元注解
标准注解
- @Override: 对覆盖超类中的方法进行标识,如果被标记的方法并没有实际覆盖超类中的方法,则编译器会发出错误警告。
- @Deprecated:对不鼓励使用或者已经过时的方法添加注解,当编程人员使用这些方法时,将会在编译时显示提示信息。
- @SuppressWarnings:选择性地取消特定代码段中的警告。
- @SafeVarargs:JDK 7 新增,用来声明使用了可变长度参数的方法,其在与泛型类一起使用时不会出现类型安全问题。
元注解
元注解就是用来注解其他注解,从而创建新的注解。
- @Targe:注解所修饰的对象范围。
- @Inherited:表示注解可以被继承。
- @Documented:表示这个注解应该被 JavaDoc 工具记录。
- @Retention: 用来声明注解的保留策略。
- @Repeatable:JDK 8 新增,允许一个注解在同一声明类型(类、属性或方法)上多次使用。
@Targe 注解取值是一个 ElementType 类型的数组,有以下几种取值:
- ElementType.Type:能修饰类、接口或枚举类型。
- ElementType.FIELD:能修饰成员变量。
- ElementType.METHOD:能修饰方法。
- ElementType.PARAMETER:能修饰参数。
- ElementType.CONSTARUCTOR:能修饰构造方法。
- ElementType.LOCAL_VARLABLE:能修饰局部变量。
- ElementType.ANNOTATION_TYPE:能修饰注解。
- ElementType.PACKAGE:能修饰包。
- ElementType.TYPE_PARAMETER:类型参数声明。
- ElementType.TYPE_USE:使用类型。
@Retention 注解有3种类型,分别表示不同级别的保留策略。
- RetentionPolicy.SOURCE:源码级注解。注解信息只会保留在.java 源码中,源码在编译后,注解信息被丢弃,不会保留在.class 中。
- RetentionPolicy.CLASS:编译级注解。注解信息会保留在.java 源码以及.class 中。当运行 Java 程序时,JVM 会丢弃该注解信息,不会保留在 JVM 中。
- RetentionPolicy.PUNTIME:运行时注解。当运行 Java 程序时,JVM 也会保留该注解信息,可以通过反射获取该注解信息。
简单的应用
//能被 JavaDoc 工具类记录
@Documented
//修饰方法
@Target(ElementType.METHOD)
//运行时注解(生命周期最长)
@Retention(RetentionPolicy.RUNTIME)
public @interface Swordsman {
//default 默认值
String name() default "注解名字";
}
public class AnnotationTest {
@Swordsman(name = "haha")
public String fighting(){
return "";
}
}
public class AnnotaionProcessor {
public static void main(String[] args){
//获取该类使用注解的方法数组
Method[] declaredMethods = AnnotationTest.class.getDeclaredMethods();
for(Method m:declaredMethods){
//返回指定类型的注解对象
Swordsman annotation = m.getAnnotation(Swordsman.class);
System.out.println(annotation.name());
}
}
}