一、注解概述(Annotation)
1.1 注解是什么
注解就是代码里的特殊标记,这些标记可以在编译、类加载、运行时被读取,并执行相应的处理。通过注解,程序员可以在不改变原有代码逻辑的情况下,在源文件中嵌入一些补充信息。代码分析工具、开发工具和部署工具可以通过这些补充信息进行验证或者进行部署。
注解可以用来修饰包、类、构造器、方法、成员变量、参数、局部变量的声明。
1.2 用途
1、JavaSE:标记重写、标记过时的功能、忽略警告等。
2、JavaEE:配置应用程序的任何切面,代替 xml 配置等。
3、框架 = 注解 + 反射 + 设计模式
二、JDK 中三个基本注解的使用
2.1 @Override
限定重写父类方法 , 该注解只能用于修饰方法
2.2 @Deprecated
用于表示所修饰的元素 (类, 方法等 )已过 时。通常是因为 所修饰的结构危险或存在更好选择
2.3 @SuppressWarning
抑制编译器警告
public class AnnotationTest {
@Override
public String toString() {
return "重写的 toString() 方法";
}
@SuppressWarnings("unused")
public void unusedFun() {
System.out.println("未被使用的方法");
@SuppressWarnings("unused")
String val = "未被使用的变量";
}
@Deprecated
public void print() {
System.out.println("过时的方法");
}
}
三、自定义注解(必须结合反射才有用)
自定义注解参考 @SuppressWarnings 和 @Override 即可
1、用 @interface 来声明一个注解
2、定义成员(如果不定义成员,那么注解只用来做标记,如 @Override)
注意:注解的成员是函数,在使用起来像是属性。
3、可设置成员的默认值
例:
public class MyAnnotationTest {
@MyAnnotation
public void defaultAnnotation() throws NoSuchMethodException {
Class<MyAnnotationTest> clazz = MyAnnotationTest.class;
//通过反射获得 MyAnnotationTest 的 defaultAnnotation 方法, 再获得该方法的注解
Annotation a = clazz.getDeclaredMethod("defaultAnnotation").getAnnotation(MyAnnotation.class);
MyAnnotation m = (MyAnnotation) a;
String value = m.value();
System.out.println(value);
}
@MyAnnotation(value = "非默认注解")
public void undefaultAnnotation() throws NoSuchMethodException {
Class<MyAnnotationTest> clazz = MyAnnotationTest.class;
//通过反射获得 MyAnnotationTest 的 undefaultAnnotation 方法, 再获得该方法的注解
Annotation a = clazz.getDeclaredMethod("undefaultAnnotation"). getAnnotation(MyAnnotation.class);
MyAnnotation m = (MyAnnotation) a;
String value = m.value();
System.out.println(value);
}
public static void main(String[] args) throws NoSuchMethodException {
MyAnnotationTest myAnnotationTest = new MyAnnotationTest();
myAnnotationTest.defaultAnnotation();
myAnnotationTest.undefaultAnnotation();
}
}
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String value() default "默认注解";
}
四、JDK 中四个基本的元注解
元注解:用来修饰其他注解的注解。
4.1 @Retention
@Retention 用于修饰注解的生命周期,@Retention 中包含有一个 RetentionPolicy 类型的成员变量,使用 @Retention 时必须为该成员变量指定值:
@RetentionPolicy.SOURCE:在源文件中有效,编译期间被丢弃
@RetentionPolicy.CLASS:编译期间有效,会被保存到 .class 文件中,运行期间被丢掉
@RentationPolicy.RUNTIME:运行时有效,程序可以通过反射来获得该注解。(如果把上述示例中的 @Retention 删除,程序会报空指针异常。)
4.2 @Target
用于修饰注解的修饰范围(包、类、函数、局部变量等)
4.3 @Documented
被它修饰的注解将被 javadoc 工具提取成文档。默认情况下,javadoc 是不包括注解的。
4.4 @Inherited
-4ZX3Y9rr-1587304710467)]
4.3 @Documented
被它修饰的注解将被 javadoc 工具提取成文档。默认情况下,javadoc 是不包括注解的。
4.4 @Inherited
被它修饰的注解将具有继承性,如果某个类用了被它修饰的注解,那么该类的子类也自动获得该注解。