java注解通俗易懂系列教程二之自定义注解步骤
1.自定义注解
回顾一下官方提供的注解:Java 定义了一套注解,共有 7 个,3 个在 java.lang 中,剩下 4 个在 java.lang.annotation 中。
作用在代码的注解是:
- @Override - 检查该方法是否是重载方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。
- @Deprecated - 标记过时方法。如果使用该方法,会报编译警告。
- @SuppressWarnings - 指示编译器去忽略注解中声明的警告。
从 Java 7 开始,额外添加了 3 个注解:
- @SafeVarargs - Java 7 开始支持,忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告。
- @FunctionalInterface - Java 8 开始支持,标识一个匿名函数或函数式接口。
- @Repeatable - Java 8 开始支持,标识某注解可以在同一个声明上使用多次。
作用在其他注解的注解(或者说 元注解)是:(这个是官方提供写自定义注解时使用的注解,制作自定义注解本期就使用这四个)
- @Retention - 标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问。
- @Documented - 标记这些注解是否包含在用户文档中。
- @Target - 标记这个注解应该是哪种 Java 成员。
- @Inherited - 标记这个注解是继承于哪个注解类(默认 注解并没有继承于任何子类)
其中target在java1.8的时候还引入两个属性上图没有
TYPE_PARAMETER
在【类型参数】上使用 Java 1.8 引入TYPE_USE
在【任何声明类型的地方】上使用 Java 1.8 引入)
2.知道官方提供的注解后,开始正式开始本期的自定义注解教程
整体步骤一共分为三步:1.定义注解格式 2. 配置元注解 3.定义参数 4.定义注解逻辑
(1).定义注解格式
修饰符 @interface 注解名 {
注解元素的声明1
注解元素的声明2
}
(2). 配置元注解
根据使用情况适当配置**@Retention,@Documented,@Target,@Inherited**这四个元注解
其中target在java1.8的时候还引入两个属性上图没有
TYPE_PARAMETER
在【类型参数】上使用 Java 1.8 引入TYPE_USE
在【任何声明类型的地方】上使用 Java 1.8 引入)
(3).定义参数
自定义的参数类型只能为以下类型:
- 所有的基本类型:byte、short、char、int、long、float、double
- String类型
- Class类型
- enum类型
- Annotation类型
- 以上类型的数组
参数可以使用default 定义默认值,如下:
修饰符 @interface 注解名 {
String name() default "";
注解元素的声明2
}
(4).定义注解逻辑(具体demo看下一篇教程)
这一步是最关键的,通过aop等方法(不一定非得aop,不过目前最多的就是aop)拦截注解前后,根据注解(通过反射获取)的参数内容,在代码前后执行特定的逻辑(这一步用到通过反射执行)。
总结:写自定义注解:1.定义注解格式 2. 配置元注解 3.定义参数 4.定义注解逻辑前三步都好理解。第四步就是需要先确定代码的执行范围,然后拦截代码并通过反射获取注解的内容执行特定的代码逻辑,再通过反射执行方法(常见的是aop+反射)。
补充问题:对于确定注解执行范围有的不太理解,我怎么预测注解会在哪里执行?
答:你是写这个自定义注解,你让使用者在哪里用,肯定就得只能在这个范围。你是制定规则的人,谁万一不遵守就不让使用这个注解,想想你常用的注解,用错地方了是不是会无效。所以执行范围就是你代码逻辑生效的地方,比如哪个包,哪个类才生效。
还没有评论,来说两句吧...