Skip to content

Java 中的注解详解

直接是 JDK1.5 引入的特性,用于对代码进行说明,可以对包、类、接口、字段、方法参数、局部变量等进行注解。注解是框架学习和设计者必须掌握的基础

注解基础

注解的作用:

  • 生成文档,通过代码里标识的元数据生成 javadoc 文档
  • 编译检查,通过代码里标识的元数据让编译器在编译期间进行检查验证。
  • 编译时动态处理,编译时通过代码里标识的元数据动态处理,例如动态生成代码。
  • 运行时动态处理,运行时通过代码里标识的元数据动态处理,例如使用反射注入实例

注解的常见分类:

  • Java自带的标准注解,包括@Override、@Deprecated和@SuppressWarnings,分别用于标明重写某个方法、标明某个类或方法过时、标明要忽略的警告,用这些注解标明后编译器就会进行检查。
  • 元注解,元注解是用于定义注解的注解,包括@Retention、@Target、@Inherited、@Documented,@Retention用于标明注解被保留的阶段,@Target用于标明注解使用的范围,@Inherited用于标明注解可继承,@Documented用于标明是否生成javadoc文档。
  • 自定义注解,可以根据自己的需求定义注解,并可用元注解对自定义注解进行注解。

Java 内置注解

  • @Override:表示当前的方法定义将覆盖父类中的方法
  • @Deprecated:表示代码被弃用,如果使用了被@Deprecated注解的代码则编译器将发出警告
  • @SuppressWarnings:表示关闭编译器警告信息

元注解

  • @Target,描述注解的使用范围(即:被修饰的注解可以用在什么地方)
  • @Retention & @RetentionTarget,描述注解保留的时间范围(即:被描述的注解在它所修饰的类中可以被保留到何时)。
  • @Documented,描述在使用 javadoc 工具为类生成帮助文档时是否要保留其注解信息
  • @Inherited,被它修饰的Annotation将具有继承性。如果某个类使用了被@Inherited修饰的Annotation,则其子类将自动具有该注解。
  • @Repeatable (Java8),
  • @Native (Java8),使用 @Native 注解修饰成员变量,则表示这个变量可以被本地代码引用,常常被代码生成工具使用。对于 @Native 注解不常使用,了解即可

注解与反射接口

定义注解后,如何获取注解中的内容呢?反射包java.lang.reflect下的AnnotatedElement接口提供这些方法。这里注意:只有注解被定义为RUNTIME后,该注解才能是运行时可见,当class文件被装载时被保存在class文件中的Annotation才会被虚拟机读取

自定义注解

深入理解注解

注解支持继承吗

注解实现的原理

应用

配置化到注解化 - 框架的演进

自定义注解和 AOP - 通过切面实现解耦

参考