注解快速入门

注解就是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);//判断当前对象是否存在某个注解

posted @ 2024-07-19 09:33  北冥有鱼要继续奋斗  阅读(20)  评论(0编辑  收藏  举报