Java中的注解原来是这样回事的

前言

在我们平常的代码开发过程中,遇见过无数的注解,大多数注解都是我们使用的框架所给我们集成好了的,相信也很少有人使用自己编写的注解,我也如此,但是只有当你了解了注解背后的秘密后,一定会对它有不同的看法。

注解,也被称为元数据,可以为我们在代码中添加信息提供一种形式化的方法,使我们可以在稍后某个时刻非常方便地使用这些数据

注解的优点

使用注解有许多的优点:

注解能使编译器来测试和验证格式,存储有关程序的额外信息。

注解可以用来生成描述符文件,有助于减轻编写“样板”代码的负担、

使用注解可以将这些元数据保存在Java源代码中。并利用annotation API为我们的注解构造处理工具。

注解提供编译器类型检查以及更加干净易读的便利。

Java中的注解

目前Java提供三种内置注解:

@Override,表示当前的方法定义将覆盖超类中的方法。

@Deprecated,如果程序员使用了注解为它的元素,那么编译器会发出警告信息。

@SuppressWarnings,关闭不当的编译器警告信息。

除此之外,Java还另外提供了四种元注解,专门负责新注解的创建。可理解为注解的注解。

@Target:表示该注解可以用于什么地方。

@Retention:表示需要在什么级别保存该注解信息。

@Documented:将此注解包含在Javadoc中

@Inherited:允许子类继承父类中的注解

如何定义注解

注解的定义很像接口的定义,并且与其他任何Java接口一样,注解也将会编译成class文件。

除了符号外,注解的定义很像一个空的接口。在定义一个注解的时候,会需要使用到我们上面的元注解,如和。像我们这里定义的注解称为标记注解,因为在注解内没有任何元素。上面这个注解的使用方式:@Test。

下面我们来看一下中的注解:

从中可以看出这个注解是应用于类、接口上的,并且是在运行期保存注解信息。该注解中有5个元素,为默认值。注解的元素在使用时表现为名-值对的形式,例如我们可以使用的方式设置该实体类对应的数据库表名为。

注解处理器

当我们编写好我们的注解后如果没有用来读取注解的工具的话,那么注解对于我们来说也就没有太大意义了。在Java SE5扩展了反射机制的API,以帮助程序员构造这类工具。

我们首先定义一个简单的注解:

我们将该注解用于一个实体类中:

接下来我们编写注解处理器,通过反射机制来查找注解中的信息。

输出结果如下:

在这个注解处理器程序中,我们用到了两个反射的方法:和,这两个都是接口(Class、Method和Field等类都实现了该接口)。方法返回指定类型的注解对象,在这里就是。如果被注解的方法上没有该类型的注解,则返回null值。然后我们通过调用和方法从Person对象中提取元素的值。

案例驱动

下面我们写一个注解小栗子,它将读取一个实体类,检查其上的数据库注解,并生成用来创建数据库的SQL命令:

下面是我们要使用到的注解:

注解应用到的实体类:

最后就是注解处理器:

先来看看运行结果把:

在方法中,使用加载User实体类,并使用检查该实体类是否带有@DBTable注解。如果有,就将表名保存下来。然后读取这个类的所有域,并用进行检查,该方法返回一个域上的所有注解。最后用操作符来判断这些注解的类型。

在注解中嵌套使用的注解被传递到方法中,由它负责构造一个包含SQL的String对象。

总结

通过一个简单的案例来说明注解的使用再合适不过了,对于注解的理解在我们平常的使用过程中也能更加得心应手。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180923G1AJA300?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券