定义

  • 注解,就是元数据,即一种描述数据的数据。可以说,注解就是源代码的元数据,用来描述一个类、方法、参数、变量、构造器和包的一些特点,比如说某个方法是父类的重写,它的作用域在哪里等等。
  • 简单理解为一种标记,通过这个标记可以获取一定的关联信息。

    举个栗子

  • 比如,下面这段代码:
  • 上面代码中重写了toString方法并使用了@override注解,它告诉编译器这个方法是一个重写方法,如果父类中不存在该方法,编译器会报错,停水该方法没有重写父类中的方法。如果不小心拼写错误,而且也没有使用@override注解,那程序依然能编译运行,但运行结果就会和期望的大不相同。

    优点

  • 在使用Annotation(注解)之前,xml被广泛地运用于描述元数据,但是其维护十分困难(因为代码繁琐与松耦合性,某些情况下甚至是完全分离的)。他们希望使用一些和代码紧耦合的东西。
  • 假如你想为应用设置很多的常量或参数,这种情况下,xml是很好的选择,因为它不会和特定的代码相连。如果你想把某个方法声明为服务,那么使用Annotation会更好一些,因为这种情况下需要注射和方法紧密结合。
  • 目前,许多框架将xml和Annotation两种方式结合起来,平衡两者的利弊。

元注解

  • java提供了四种元注解,专门注解其他的注解。
  • @Documented–注解是否将包含在javadoc中
  • @Retention–在什么时期保存该注解(生命周期)
    • RetentionPolicy.SOURCE–注解只保存在.java文件中,编译后被丢弃。这些注解在编译结束后就不再有意义,所以它们不会被写入字节码。如,@Override等。
    • RetentionPolicy.CLASS–保存到.class文件中,类加载(运行)时丢弃。注解默认使用这种方式。
    • RetentionPolicy.RUNTIME–始终不会丢弃。自定义注解通常使用的方式。
  • @Target–注解作用于什么地方。若不明确指出,注解可以放在任何地方。

    • ElementType.TYPE:用于描述类、接口或enum声明
    • ElementType.FIELD:用于描述实例变量
    • ElementType.METHOD
    • ElementType.PARAMETER
    • ElementType.CONSTRUCTOR
    • ElementType.LOCAL_VARIABLE
    • ElementType.ANNOTATION_TYPE 另一个注释
    • ElementType.PACKAGE 用于记录java文件的package信息
  • @Inherited–允许子类继承该注解

    自定义注解

  • 注解中所有的属性被定义成方法,并允许提供默认值。
  • 下面的例子有三个属性:author、priority和status。
  • 注解的使用:
    • @<注解名>(<成员1>=<成员1值>,<成员2>=<成员2值>,…)
  • 下面的例子演示了如何使用上面的注解:
  • 如果注解中只有一个属性,可以直接命名为“value”,使用时无需再标明属性名。

解析注解

  • 利用反射将被注解的类或方法等的注解信息解析出来(获取注解信息)
  • 下面这个注解是用来描述类或方法的
  • 下面的例子使用了上面的注解
  • 对这个类及其方法解析一下注解(看看注释知道个大概就行了)
  • 运行结果