什么是注解
- 注解也叫元数据,一种代码级别的说明。
- 它是JDK1.5引入的一个新特性,与类、接口、枚举是在同一个层次。
- 它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些数据进行说明。
注解分类
- 编写文档,通过代码里标识的注解生成文档
/**
* 注解文档演示
*
* @author SN
* @version 1.0
* @since 1.5
*/
public class AnnotationDoc {
/**
* 加法运算
* @param a 整数
* @param b 整数
* @return 两数之和
*/
public int add(int a, int b){
return a+b;
}
}
执行命令, 会生成Api文档
javadoc AnnotationDoc .class
正在加载源文件AnnotationDoc.java...
正在构造 Javadoc 信息...
标准 Doclet 版本 1.8.0_131
正在构建所有程序包和类的树...
正在生成.\com\test\annotation\AnnotationDoc.html...
正在生成.\com\test\annotation\package-frame.html...
正在生成.\com\test\annotation\package-summary.html...
正在生成.\com\test\annotation\package-tree.html...
正在生成.\constant-values.html...
正在构建所有程序包和类的索引...
正在生成.\overview-tree.html...
正在生成.\index-all.html...
正在生成.\deprecated-list.html...
正在构建所有类的索引...
正在生成.\allclasses-frame.html...
正在生成.\allclasses-noframe.html...
正在生成.\index.html...
正在生成.\help-doc.html...
Api文档
- 代码分析,通过代码里标识的注解对代码进行分析(使用反射)
- 编译检查,通过代码里标识的注解让编译器能够实现基本的编译检查(Override)
常见的JDK中预定义的注解
@Override : 检测被该注解标注的方法是否继承与父类(接口)
@Deprecated : 该注解标注的标识已经过时
@SuppressWarnings : 压制警告,例如 @SuppressWarnings("all")
等等....
自定义注解
- 格式
public @interface 注解名称{
属性列表;
}
- 注解的本质
MyAnno.class
public @interface MyAnno {
}
1. 执行javac命令, MyAnno.java --> MyAnno.class
javac MyAnno.class
2. 执行javap命令反编译MyAnno.class
javap MyAnno.class
Compiled from "MyAnno.java"
public interface MyAnno extends java.lang.annotation.Annotation {
}
得出结论: 注解本质上就是一个接口,该接口默认继承Annotation接口
- 属性
返回值类型
基本数据类型、String、枚举、注解和以上类型的数组
属性值
1.如果定义属性时,使用default关键字给属性默认初始化值,则使用注解时,可以不进行属性的赋值。
2.如果只有一个属性需要赋值,并且属性的名称是value,则value可以省略,直接定义值即可。
3.数组赋值时,值使用{}包裹。如果数组中只有一个值,则{}可以省略
# 自定义注解
public @interface MyAnno {
int value();
String name() default "lisi";
String[] strs();
}
# 使用注解
@MyAnno(value = 1, strs = {})
public void test(){
}
- 元注解
用于描述注解的注解
/**
元注解:用于描述注解的注解
* @Target:描述注解能够作用的位置
* ElementType取值:
* TYPE:可以作用于类上
* METHOD:可以作用于方法上
* FIELD:可以作用于成员变量上
* @Retention:描述注解被保留的阶段
* @Retention(RetentionPolicy.RUNTIME):当前被描述的注解,会保留到class字节码文件中,并被JVM读取到
* @Documented:描述注解是否被抽取到api文档中
* @Inherited:描述注解是否被子类继承
*/
@Target({ElementType.TYPE,ElementType.METHOD,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface MyAnno {
int value();
String name() default "lisi";
String[] strs();
}
网友评论