您的位置 首页 java

秒懂,Java 注解(Annotation)你可以这样学

1,什么是注解

annotation 其实是一种接口。通过Java的 反射机制 相关的API来访问Annotation信息。

注解也叫 元数据 ,例如我们常见的@Override和@Deprecated,注解是 jdk 1.5版本开始引入的一个特性,用于对代码进行说明,可以对包、类、接口、字段、方法参数、局部变量等进行注解。

一般常用的注解可以分为三类:

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

2,注解的用途

在看注解的用途之前,有必要简单的介绍下XML和注解区别,

注解:是一种分散式的元数据,与源代码紧绑定。

xml: 是一种集中式的元数据,与源代码无绑定

当然网上存在各种XML与注解的辩论哪个更好,这里不作评论和介绍,主要介绍一下注解的主要用途:

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

3,注解使用演示

下面总共定义了4个注解来演示注解的使用

  1. 定义一个可以注解在Class,interface,enum上的注解,
  2. 定义一个可以注解在METHOD上的注解
  3. 定义一个可以注解在FIELD上的注解
  4. 定义一个可以注解在PARAMETER上的注解

编写一个测试处理类处理以上注解,这边不过多解释,代码中都写了对应的注释如下:

4,注解的实现原理

以上只抽取了注解的其中几种类型演示,下面让我们一起来看看他们是怎么工作的

让我们先看一下实现注解三要素:

1,注解声明、

2,使用注解的元素、

3,操作注解使其起作用(注解处理器)

首先我们让看一下java中的元注解(也就是上面提到的注解的注解),总共有4个如下:

  • @Target,
  • @Retention,
  • @Documented,
  • @Inherited

这4个元注解都是在jdk的java.lang.annotation包下面

@Target

Target说明的是Annotation所修饰的对象范围,源码如下:

其中只有一个元素ElementType,再看看它的源码如下:

ElementType是一个枚举类定义注解可以作用的类型上,上面例子中演示了TYPE,FIELD,METHOD,PARAMETER 4种可以作用的目标

@Retention

定义了该Annotation被保留的时间长短:某些Annotation仅出现在源代码中,而被编译器丢弃;而另一些却被编译在 class文件 中;编译在class文件中的Annotation可能会被虚拟机忽略,而另一些在class被装载时将被读取(请注意并不影响class的执行,因为Annotation与class在使用上是被分离的)。使用这个元注解可以对 Annotation的“生命周期”限制

@Documented

@Documented用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。Documented是一个标记注解,没有成员

@Inherited

@Inherited 元注解是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类

注意:@Inherited annotation类型是被标注过的class的子类所继承。类并不从它所实现的接口继承annotation,方法并不从它所重载的方法继承annotation。

当@Inherited annotation类型标注的annotation的Retention是RetentionPolicy.RUNTIME,则反射API增强了这种继承性。如果我们使用java.lang.reflect去查询一个@Inherited annotation类型的annotation时,反射代码检查将展开工作:检查class和其父类,直到发现指定的annotation类型被发现,或者到达类继承结构的顶层。

这边针对这个专门写了一个例子方便大家理解,在以上MyTargetType注解类中增加@Inherited注解,如下:

下面再给大家一个实际的案例:

喜欢的小伙伴,请多多关注+点个赞吧!

文章来源:智云一二三科技

文章标题:秒懂,Java 注解(Annotation)你可以这样学

文章地址:https://www.zhihuclub.com/195694.shtml

关于作者: 智云科技

热门文章

网站地图