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+反射)。

补充问题:对于确定注解执行范围有的不太理解,我怎么预测注解会在哪里执行?

答:你是写这个自定义注解,你让使用者在哪里用,肯定就得只能在这个范围。你是制定规则的人,谁万一不遵守就不让使用这个注解,想想你常用的注解,用错地方了是不是会无效。所以执行范围就是你代码逻辑生效的地方,比如哪个包,哪个类才生效。

猜你喜欢

转载自blog.csdn.net/Mint6/article/details/103835308