1 @interface 关键字
我们想定义一个自己的注解 需要使用 @interface 关键字来定义。
如定义一个叫 MyAnnotation 的注解:
public @interface MyAnnotation { }
2 元注解
光加上 @interface 关键字 还不够,我们还需要了解5大元注解
- @Retention
- @Target
- @Documented
- @Inherited(JDK8 引入)
- @Repeatable(JDK8 引入)
1)@Retention 指定注解的生命周期
@Retention(RetentionPolicy.SOURCE)
其中Retention是一个枚举类:
RetentionPolicy.SOURCE :
注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃(.java文件)RetentionPolicy.CLASS :
注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期(.class文件)RetentionPolicy.RUNTIME:
注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在(内存中的字节码)
2)@Target指定注解可以修饰的元素类型
@Target(ElementType.Field)
ElementType.ANNOTATION_TYPE
- 标记的注解可以应用于注解类型。ElementType.CONSTRUCTOR
- 标记的注解可以应用于构造函数。ElementType.FIELD
- 标记的注解可以应用于字段或属性。ElementType.LOCAL_VARIABLE
- 标记的注解可以应用于局部变量。ElementType.METHOD
- 标记的注解可以应用于方法。ElementType.PACKAGE
- 标记的注解可以应用于包声明。ElementType.PARAMETER
- 标记的注解可以应用于方法的参数。ElementType.TYPE
- 标记的注解可以应用于类的任何元素。
3)@Documented
指定注解会被JavaDoc工具提取成文档。默认情况下,JavaDoc是不包括文档的
4)@Inherited
表示该注解会被子类继承,注意,仅针对类,成员属性、方法并不受此注释的影响。
5)@Repeatable
表示注解可以重复使用,为了解决同一个注解不能重复在同一类/方法/属性上使用的问题。
其中最常用的就是 @Retention 跟 @Target。
3 简单实现
/**
* 自定义的权限验证注解
*
*/
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface CustomAccess {
/**
* 是否需要实名认证,默认 true
*
* @return
*/
boolean verify() default true;
/**
* 允许调用的用户类型
*
* @return
*/
UserType userType() default UserType.ALL;
/**
* 用户类型
*/
enum UserType {
/**
* 普通用户
*/
NORMAL,
/**
* 专家用户
*/
SPECIALIST,
/**
* 所有用户
*/
ALL;
}
}
4 使用切面执行自定义注解逻辑
在开发中一般加上注解之后会自动执行一些逻辑,大部分实现的原理是使用切面来实现注解的逻辑的。