前言

近日在阅读开源项目,发现项目里好多奇奇怪怪的注解(@DataScope、@Log...)看得我一脸懵,不知道大家是否也有过这样的经历,回想了一下,发现自己对于注解的知识,好像只停留在@Override。。。异常尴尬,所以今天就补补注解这个知识,并把自己的收获记录在此,与大家一同交流,如有不对的地方,敬请指正!

希望本文能给读者带来以下收获:

·明白注解是什么,大概有什么用

·能理解别人代码里面注解的作用

·能使用自定义注解

一、什么是注解

想要了解某个知识点,我首先推荐的都是去官网查看,下面看看Java官方对注解的解释:

Annotations, a form of metadata, provide data about a program that is not part of the program itself. Annotations have no direct effect on the operation of the code they annotate.

注解是元数据的一种形式,它提供有关程序的数据,但这些数据不是程序本身的一部分。注解对它们注释的代码的操作没有直接影响。

一堆英文读完,一阵云里雾里。没关系,这是正常操作,不过我们从翻译中还是可以了解到注解可以提供数据,并且数据是独立于程序的,那么我们大致可以推断出,注解其实是介于程序和数据之间的一种媒介,程序和数据通过注解达成了某种联系,即注解类似一根红线,把数据和程序关联在一起。

二、从@Override开始

通过对Java官方提供的注解解释的翻译,我们筛选推断出了一个关键信息——关联。那到底如何理解这个词呢?别急,我们从最熟悉的陌生人@Override开始,最熟悉是因为我们知道这是方法重写,子类覆盖父类方法用到的注解,陌生是因为我们从来没有点进去了解过这个注解,那接下来就进去看看吧!

 import java.lang.annotation.*; @Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) public @interface Override { }

短短的5行,好像除了第一行,其他啥都不知道。。。不急,我们一行一行来解读!

·注解导入了一个annotation包

·注解的“套娃”行为@Target(ElementType.METHOD)、@Retention(RetentionPolicy.SOURCE)

·不同于接口和类的声明public @interface Override { }

除了对新注解不认识,我们大致可以了解到注解的定义格式,修饰符 @interface 注解名{}。(有点接口的感觉)

三、禁止套娃——元注解

通过对@Override的剖析,我们了解了注解的定义格式,不过我们发现注解里面又有新的注解,本着刨根问底的好奇心,我们继续进入@Target注解一探究竟!

 @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Target {     ElementType[] value(); }

一直点击,发现始终在@Documented、@Retention、@Target这几个注解之间套娃,通过Java文档我们了解到原来这些修饰注解的注解叫做元注解。元注解(meta-annotation)在java.lang.annotation包下:

@Retention

表示如何存储被标记的注解(指定存储级别),有以下三个级别

·RetentionPolicy.SOURCE:只保留到源码级别,在编译阶段会被忽略,所以他们不会被写入字节码。

·RetentionPolicy.CLASS:(默认)编译级别,在编译时由编译器保留,但被Java虚拟机(JVM)忽略。

·RetentionPolicy.RUNTIME:由JVM保留,可以在运行时环境使用。

@Target

表示被标记的注解可以用于哪种java元素(类、接口、属性、方法......),有以下八种

@Documented

无论何时使用指定的注解,都应使用Javadoc工具记录这些元素。(即会在生成的javadoc中加入注解说明)

@Inherited

可以从超类继承注释类型,仅用于类的声明(接口不会继承)

@Repeatable

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

四、注解的分类

通过对元注解的了解,我明白了一个注解都是由这些元注解修饰而来,而且我们也收获了一个重要信息——注解可以修饰注解

这样无限的套娃,就会有各种各样的注解,那么到底有哪些注解呢?常见的注解大致分为以下四类:

元注解

即上文提及的5个元注解

jdk注解

常见的如

@Override @Deprecated @SuppressWarnings @SafeVarargs @FunctionalInterface

第三方注解

即第三方框架提供的注解,例如自动注入依赖@Autowired、@Controller等

自定义注解

即开发人员根据项目需求自定义的注解,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。

实战——定义自己的注解

看过了Java提供的注解,相信你已经对注解有个大致的了解了。那你有没有想过,注解是如何化腐朽为神奇,加了一个简单的@Autowired就能实现依赖注入、@Setter就能实现set方法的生成,下面通过简单的实战来体会一下注解的神奇之处吧!

实战目标:

使用自定义注解,通过在实体类及其属性上加注解,实现对实体类查询sql语句的构造

ps:类似select * from t_user where t_name='kingwan'的形式

自定义注解的编写规则

在开始实战之前,我们先了解一下编写自定义注解的规则:

·注解的定义为@interface,所有的注解会自动继承java.lang.Annotation这个接口,并且不能再去继承别的类或者接口

·参数成员只能用public或default(默认)访问权限符修饰

·参数成员只能用八大基本数据类型、String、Enum、Class、annotations等数据类型,以及这些类型的数组

·要获取类方法和字段的注解信息,必须通过java反射机制来获取

·注解也可以没有定义成员(只起到标识作用)

了解了注解的定义规范,接下来我们开始进入正式的实战环节。

1.自定义注解@KingwanTable、KingwanColumn

对于实体类查询的sql语句,我们需要知道两个信息:①查询的表名②字段名。并且我们通常习惯将用户表t_user对应于实体类User,那么我们如何和把t_user和User进行关联呢?一想到关联,回顾我们最开始从官方文档中提取出来的信息,没错,就是使用注解关联。接下来定义两个自定义注解:

·@KingwanTable:注解实体类对应的表名

@Target(ElementType.TYPE)//作用在类/接口上 @Retention(RetentionPolicy.RUNTIME)//保留作用域:保留到运行时 public @interface KingwanTable {     String value();//参数:表名 }

·@KingwanColumn:注解实体类属性对应的表字段名

@Target(ElementType.FIELD)//表示作用在字段上 @Retention(RetentionPolicy.RUNTIME)//保留到运行时 public @interface KingwanColumn {     String value();//参数:字段名 }

2.实体类添加上自定义注解

有了自定义的两个注解,那么我们现在就可以把它们加在实体类上。

·以下代码定义了一个Student实体类,加上了@KingwanTable("t_student")映射表名,

·以下代码创建了一个student对象,并初始化信息

3.反射获取注解信息

有了一个加了自定义注解的Student实体类,那么我们想要构造SQL,就有以下思路:

获取到注解的信息(获取表名、字段名)=>获取属性的值(字段值)=>构造SQL

如何获取呢?规则里说了,使用反射。

以下代码通过获取student的class对象,获取类上的注解@KingwanTable信息。

aClass.isAnnotationPresent:判断指定的注解是否存在

此时SQL打印的结果:

获取到了类上的注解信息,接下来我们来看看如何获取属性上的注解信息

此时SQL的结果:

当然,如果有小伙伴跟着本文敲,可能在这一步就走不下去了,这是因为我们的get方法返回的字段类型多种多样,所以仅仅invoke instanceof String是不够的,我们还需要考虑其他情况(Integer、Date),限于篇幅原因,这里不做过多介绍,大家完全可以自行补充,如果想了解我的实现思路,移步:案例源码地址

这样,是不是就达到了我们要的效果了,对于任意简单实体类,我们都可以通过加上该注解实现一个简单的查找SQL的生成

你学废了吗!

总结

相信大家看我之后可能会有疑问,注解好复杂,费一大堆功夫,还不如直接点呢!的确,我最开始也觉得注解有点鸡肋,不过用久了之后,发现真香!而且注解的作用不仅仅这些,本文的目的是让大家对注解有一个简单的了解,当你看到别人写的注解是多么巧妙时,你也许就会发现,原来注解这么好用!

·在编译时进行格式检查。如@Override

·跟踪代码依赖性,实现替代配置文件功能。通过处理注解信息生成代码、XML文件。

·一些注释可以在运行时进行检查

结尾一张图

一张思维导图总结一下内容,保存下来,时常复习!

java 自定义注解_Java注解相关推荐

  1. java 自定义json解析注解 复杂json解析 工具类

    java 自定义json解析注解 复杂json解析 工具类 目录 java 自定义json解析注解 复杂json解析 工具类 1.背景 2.需求-各式各样的json 一.一星难度json[json对象 ...

  2. java 多重注解_Java注解-元数据、注解分类、内置注解和自定义注解

    大家好,我是乐字节的小乐,上次说过了Java多态的6大特性|乐字节,接下来我们来看看Java编程里的注解. Java注解有以下几个知识点:元数据 注解的分类 内置注解 自定义注解 注解处理器 Serv ...

  3. java注解_Java注解教程及自定义注解

    Java注解提供了关于代码的一些信息,但并不直接作用于它所注解的代码内容.在这个教程当中,我们将学习Java的注解,如何定制注解,注解的使用以及如何通过反射解析注解. Java1.5引入了注解,当前许 ...

  4. java自定义字段_Java自定义注解实战

    注解简介 注解的本质是一个接口,该接口默认继承Annotation接口,使用@interface进行定义.注解主要有三类:元注解.自定义注解以及框架定义的注解. 接口里面的成员方法称为注解的属性 定义 ...

  5. java method 注释_Java注解

    Java注解 注解概述 3.注解 3.1.注解,或者叫做注释类型,英文单词是:Annotation 疑问:注解到底是干啥的????????? 3.2.注解Annotation是一种引用数据类型.编译之 ...

  6. java threadsafe 注解_Java 注解详解

    什么是注解 Annotation 中文译过来就是注解.标释的意思,在 Java 中注解是一个很重要的知识点,但经常还是有点让新手不容易理解.而新手很难理解的主要原因是一些技术文档里的专业术语和名词不太 ...

  7. java 注释 过时_Java 注解

    前言 为什么需要学习注解? 1.能够灵活地使用框架提供的注解,最后能够读懂框架的源码 2.能够配合反射将代码书写更加的灵活,更加易于维护易于扩展,Properties配置,XML配置,注解配置[Jav ...

  8. java 获取注解_java 注解annotation的使用,以及反射如何获取注解

    1.元注解 元注解是指注解的注解.包括  @Retention @Target @Document @Inherited四种. 1. Annotation型定义为@interface, 所有的Anno ...

  9. java method 注解_JAVA 注解详解及简单实例

    JAVA 注解详解及简单实例 何为注解 注解(Annotation)又称为元数据,在JDK1.5后引入,它的作用是: 生成文档  这是注解的原始用途,可以通过注解生成JavaDoc文档 跟踪代码的依赖 ...

最新文章

  1. Badread: simulation of error-prone long reads
  2. java内存模型浅析_浅析java内存模型
  3. GATT之Device information Service
  4. 在Spring MVC Web应用程序中使用reCaptcha
  5. Modbus协议栈实现Modbus RTU多主站支持
  6. 后端程序员必备:索引失效的十大杂症
  7. 自建服务器同步软件,自建Syncthing中继服务器(私密传输或造福大众)
  8. print (re.findall((?:abc)+,abcabcabc))
  9. python的数值类型和运算符_Python全栈工程师(数值类型、运算符)
  10. pytorch dataset
  11. Java测试类的创建
  12. 【笔记环境】Typora+Joplin+PicGo+Gitee+Onedrive
  13. upnp+捕捉摄相头客户端程序
  14. python找不到解释器_解决pycharm找不到解释器的问题
  15. 射频原理图设计checklist
  16. visual studio 代码格式化的若干方法(含快捷键)
  17. 开源免费的脑电/脑磁图数据分析软件汇总
  18. vue 启动项目时动态切换 ip
  19. 定义一个学生类Student,包含三个属性姓名、年龄、性别,创建三个学生对象存入ArrayList集合中?
  20. oracle的faq,ORACLE之常用FAQ V1.0

热门文章

  1. cesium billboard 点击 不想显示infobox
  2. log4net使用指南(转载)
  3. 天猫整站SSM-分页-limit(做个人学习笔记整理用)
  4. php 文件类型 html,HTML的文档类型怎么选择
  5. linux查用户的家目录,详解Linux误删用户家目录的恢复方法
  6. 计算机组装与维护配置清单作业,计算机组装与维护 作业汇.doc
  7. 【C语言进阶深度学习记录】二十 结构体大小计算与结构体内存布局的详细方法
  8. delphi 参数化sql
  9. 【网络爬虫入门04】彻底掌握BeautifulSoup的CSS选择器
  10. 使用EFI引导从硬盘(U盘)安装Win7的图文教程