注解快速入门
注解就是Java代码里的特殊标记,比如:@Override,@Test等,它可以让其他程序根据注解信息来决定怎么执行该程序。注解可以用在类上、构造器上、方法上、成员变量上、参数上。注解主要包括两种,一种是元注解,另一种是自定义注解,除了元注解以外的所有注解都是自定义注解。
元注解
元注解指修饰注解的注解,包括@Target、@Retention、@Documented和@Inherited。
@Target和@Retention:
@Documented:
@Documentd是java在生成文档时,是否显示注解的开关。现在我们来测试它的作用
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RestMapping {
String[] value() default {};
String[] path() default {};
}
测试类 TerminalController
@RestMapping(“/terminal”)
public class TerminalController {}
使用命令
// 生成 java doc 的命令:
javadoc -d doc TerminalController.java`
// -d 输出文件的目标目录
不给@RestMapping注解加@Documented注解的效果:
给@RestMapping注解加了@Documented的效果:
可以看到在 public class TerminalController 上面多了一个我们写的注解。这就是 @Documented 的用处。可以使得在生成java文档时被其标记的注解可以显示出来。
@Inherited:
@Inherited是一个元注解,它只能用于修饰另一个注解定义。在默认情况下,注解不会从一个类自动继承到其子类。但是,如果一个注解被@Inherited标记,那么当一个类使用了这种注解时,其子类也将隐式地拥有这个注解。但是@Inherited只对类注解有效,不适用于接口、方法或字段,而且,如果子类有同样的注解定义,那么子类的注解会覆盖从基类继承的注解。
如图SpringBoot启动类的注解就包含了上述4个元注解
自定义注解
除了元注解以外的其它所有注解都是自定义注解。可以理解为除了JDK官方定义的注解(元注解),其它所有的注解都是自定义注解。
public @interface 注解名称(){
public 属性类型 属性名() default 默认值;
}
特殊属性名-value:
如果注解中只有一个value属性,使用注解时,value名称可以不写。但是如果除了value属性,还有其它属性,value名称就必须写。
public @interface MyTest1{
String value();//特殊属性
}
public @interface MyTest2{
String value();//特殊属性
int age();
}
public @interface MyTest3{
String value();//特殊属性
int age() default 1500;
}
@MyTest1("孙悟空")
@MyTest2(value = "孙悟空",age = 1000)
@MyTest3("孙悟空")
public class Test{
}
注解的原理
注解的本质实际上是一个接口,Java中所有注解都是继承了Annotation接口的。@注解(...)其实就是一个实现类对象,实现了该注解以及Annotation接口。
注解的解析
什么是注解的解析?
就是判断类上、方法上、成员变量上是否存在注解,并把注解里的内容给解析出来。
如何解析注解?
要解析谁的注解,就应该先拿到谁,比如要解析类上的注解,就应该先获取类的Class对象,再通过Class对象解析其上面的注解,要解析成员方法上的注解,则应先获取该成员方法的Method对象,再通过Method对象解析其上面的注解。Class,Method,Filed,Constructor都实现了AnnotatedElement接口,它们都拥有解析注解的能力。
public Annotation[] getDeclaredAnnotations();//获取当前对象上面的注解
public T getDeclaredAnnotation(c1ass<T>annotationClass);//获取指定的注解对象
public boolean isAnnotationPresent(C1ass<Annotation> annotationclass);//判断当前对象是否存在某个注解