目录
什么是注解
注解的作用
Java预置注解
Java元注解
注解的本质
注解与反射的使用場景
问题思考
对于Java语言开发者而言注解必不陌生。那么注解到底是什么?有什么用?同时其本质又是什么?
什么是注解
注解是JDK1.5的新特性用来说明程序的。使用语法:
@注解名称
注解的作用
编写文档:通过代码里标识的注解生成文档 [生成doc文档]
javadoc -encoding UTF-8 DocAnno.java
public class DocAnno {
public int add(int s1, int s2){
return s1 + s2;
}
}
代码分析:通过代码里标识的注解对代码进行分析 [结合使用反射]
编译检查:通过代码里标识的注解让编译器能够实现基本的编译检查 [@Override]
Java预置注解
@Override:检测被该注解标注的方法是否是继承自父类(接口)的
@Deprecated:该注解标注的内容,表示已过时
@Suppress Warnings:压制警告,一般传递参数“all”
@FunctionalInterface:1.8之后才有,函数式接口,使用该注解之后接口必须要有一个未实现方法。
@FunctionalInterface
interface FunctionInterfaceTest{
void doWork();
default void doWork2(){}
}
Java元注解
元注解指的就是修饰注解的注解。
@Target:描述註解能夠作用的位置。
ElementType.TYPE: 可作用在类上
ElementType.METHOD: 可作用在方法上
ElementType.FIELD: 可作用在成员变量上
@Retention:描述注解被保留到的阶段
SOURCE: 表示当前注解只在代码阶段有效
CLASS: 表示该注解会被保留到字节码阶段
RUNTIME: 表示该注解会被保留到运行阶段JVM
@Document: 描述注解是否被抽取到JavaDoc的api中
@Inherited: 描述注解是否可以被子类继承
注解的本质
注解的本质其实是一个继承了java.lang.annotation.Annotation接口的接口。
通过反编译编译文件可以证实。
javap -v AnnoDemo
注解中定义的方法就是注解的属性,同时其可以定义的属性有以下类型:
String,基本数据类型、Enum、Class、注解类型以及以上类型的数组类型。
public @interface AnnoDemo {
String strValue();
int intValue();
int[] intArr();
}
注解与反射的使用場景
在实际开发中框架也会使用注解与反射的结合,此处写一个例子利用反射获取成员的注解并获取注解的属性值
自定义注解 TestAnno
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnno {
String value();
}
使用自定义注解
public class HelloAnno {
@TestAnno("测试反射获取注解属性值")
private String name;
private int id;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
反射解析类对象获取特定注解属性值
public class TestUtil {
public static void getAnnoAttrValue(Class clazz){
Field[] fields = clazz.getDeclaredFields();
for(Field field : fields){
if(field.isAnnotationPresent(TestAnno.class)){
TestAnno annotation = field.getAnnotation(TestAnno.class);
System.out.println(annotation.value());
}
}
}
}
测试类
public class TestMain {
public static void main(String[] args) {
TestUtil.getAnnoAttrValue(HelloAnno.class);
}
}
问题思考
什么是注解处理器?
注解处理的原理是什么?
如何使用注解处理器?



