定义

创建自定义注解和创建接口相似,只是在interface前加了@符号

/**
 * 这里创建了一个Open 自定义注解
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(value = {ElementType.METHOD})
public @interface Open {
   String desc();
}

元注解

元注解也就是 注解的注解,主要有如下几种:

  • @Retention - 标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问。(上面的例子中描述了是运行时注解)
  • @Documented - 标记这些注解是否包含在用户文档中。
  • @Target - 标记这个注解应该是哪种 Java 成员。(上面的例子描述了是方法上的注解)
  • @Inherited - 标记这个注解是继承于哪个注解类(默认 注解并没有继承于任何子类)

注解的组合

注解太多的时候可以将其组合起来,封装成一个注解,注解的变量通过@AliasFor对应,例如我们常用的@RestController就将@ResponseBody和@Controller组合在了一起

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {

	@AliasFor(annotation = Controller.class)
	String value() default "";

}

获取注解

Class<UserController> clazz = UserController.class;
// 获取类的指定注解
Open classAnnotation = clazz.getAnnotation(Open.class);
// 获取所有注解
Annotation[] annotations = clazz.getAnnotations();
// 获取注解的变量
String desc = classAnnotation.desc()