What

注解(也被称为元数据)为我们在代码中添加信息提供了一种形式化的方式,使我们可以在稍后的某个时刻更容易的使用这些数据。

注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记。
程序可以利用java的反射机制来了解你的类及各种元素上有无何种标记,针对不同的标记,就去做相应的事件。

Annotation(注解)是JDK5.0及以后版本引入的。它的作用是修饰程序元素。

元注解

适用于其他注释的注释称为元注释。在 java.lang.annotation 中定义了如下几个元注释类型。

  • @Retention

指定标记的注解的生命周期:

属性 说明
RetentionPolicy.SOURCE 标记的注释只保留在源层中,在class字节码文件中不包含。可以在编译时生成代码等,比如 lombok。
RetentionPolicy.CLASS 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获取
RetentionPolicy.RUNTIME 注解会在class字节码文件中存在,在运行时可以通过反射获取到
  • @Documneted

@Documented 注解表明,无论何时使用指定的注释,都应该使用Javadoc工具对这些元素进行文档化。(默认情况下,注释不包含在Javadoc中。)有关更多信息,请参见Javadoc工具页。
**

  • @Target

@Target批注标记另一个批注,以限制批注可以应用于何种Java元素。目标注释指定以下元素类型之一作为其值:

属性 说明
ElementType.ANNOTATION_TYPE 应用于注解类型
ElementType.CONSTRUCTOR 可以应用于构造函数
ElementType.FIELD 可以应用于字段或属性
ElementType.LOCAL_VARIABLE 可以应用于一个局部变量
ElementType.METHOD 可以应用于方法级注释
ElementType.PACKAGE 应用于包声明
ElementType.PARAMETER 应用于方法的参数
ElementType.TYPE 应用于类的任何元素
  • @Inheritend

@Inherited 表明注解类型可以从超类继承(这在默认情况下是不对的)。当用户查询注释类型而该类没有对此类型的注释时,将查询类的超类以获取注释类型。此注释仅应用于类声明。

  • @Repeatable

在Java SE 8中引入的 @Repeatable 注解表明标记的注解可以多次应用于相同的声明或类型使用。
**

How

自定义注解

在Java中,类使用class定义,接口使用interface定义,注解和接口的定义差不多,增加了一个@符号,即@interface。

示例

  • 定义

定义一个标签注解。可以在类、方法、字段上使用。

  1. @Retention(RetentionPolicy.RUNTIME)
  2. @Target({ElementType.TYPE, ElementType.METHOD, ElementType.LOCAL_VARIABLE})
  3. public @interface Tag {
  4. /**
  5. * tag 标签
  6. *
  7. * @return tag
  8. */
  9. String value();
  10. }
  • 使用 ```java public class DefineMethod {

    @Tag(“calc”) public void calcMethod() { }

    @Tag(“print”) public void printMethod() { }

}

  1. - **解析**
  2. ```java
  3. public class DefineMethod {
  4. /**
  5. * 解析我们定义的标签
  6. * 1. 可以根据属性的不同,进行我们希望的事情处理
  7. */
  8. public static void main(String[] args) {
  9. Method[] methods = DefineMethod.class.getDeclaredMethods();
  10. for(Method method : methods) {
  11. Tag tag = method.getAnnotation(Tag.class);
  12. if(tag != null) {
  13. System.out.println(tag.value());
  14. }
  15. }
  16. }
  17. }
  18. /*======控制台========
  19. print
  20. calc
  21. */

注意:在实际开发中,可以和 spring 结合,发挥出更大的威力,详见aop模块。

Why