什么是注解?
注释: 用文字描述程序的, 给程序员看的.
注解 ( Annotation ): 说明程序的, 给计算机看的.
定义:
- 注解, 也叫元数据, 一种代码级别的说明, 是 JDK 1.5 及以后版本的新特性.
- 与类, 接口, 枚举是在同一个层次, 它可以声明在包, 类, 字段, 方法, 局部变量的前边, 用来对这些元素进行说明.
作用分类:
- 编写文档: 生成 doc 文档.
- 代码分析: 通过注解对代码进行分析. (使用反射)
- 编译检查: 让编译器能够实现基本的编译检查. (例如: Override)
JDK 内置注解
jdk 中预定义的一些注解:
- @Override: 检测被注解标注的地方是否是继承父类 (接口) 的.
- @Deprecated: 该注解标注的内容, 表示已过时.
- @SuppressWarnings: 压制警告, 例如: @SuppressWarnings("all")
demo:
@SuppressWarnings("all") // 压制警告 interface MyInterface{ public void test(); } public class Main implements MyInterface { public static void main(String[] args) { Main m = new Main(); m.show1(); // 不推荐使用过时的方法, 但也可以调用 m.show2(); } @Override public void test() { } @Deprecated public void show1(){ System.out.println("old"); } public void show2(){ System.out.println("new"); } }
元注解
用于描述注解的注解 (类似于 py 中装饰器的嵌套)
- @Target: 描述注解能够作用的位置. ( TYPE: 可以作用于类, METHOD: 作用于方法, FIELD: 作用于成员变量 )
- @Retention: 描述注解被保留的阶段. ( 源码, 字节码[编译], runtime ), 一般使用 runtime
- @Documented: 描述注解是否被抽取到 api 文档中.
- @Inherited: 描述注解是否被子类继承.
自定义注解
格式: public @interface 注解名称{}
本质: 注解本质上就是一个接口, 该接口默认继承 Annotation 接口
- public interface MyAnno extends java.lang.annotation.Annotation {}
-
接口中可以定义的抽象方法 (称作注解的属性)
属性的返回值类型有下列取值
-
基本数据类型
-
String
-
枚举
-
注解
-
以上类型的数组
-
-
定义了属性, 在使用时需要给属性赋值
-
如果定义属性时, 使用default关键字给属性默认初始化值, 则使用注解时, 可以不进行属性的赋值
-
如果只有一个属性需要赋值, 并且属性的名称是value, 则value可以省略, 直接定义值即可
-
数组赋值时, 值使用 {} 包裹, 如果数组中只有一个值, 则 {} 可省略
-
// TODO 缺少一个注解的例子 ...
ending ~