怎样下载建设部网站,跨境电商都有哪些平台,跟建设通一样的网站,小程序代理加盟条仿前言近日在阅读开源项目#xff0c;发现项目里好多奇奇怪怪的注解(DataScope、Log...)看得我一脸懵#xff0c;不知道大家是否也有过这样的经历#xff0c;回想了一下#xff0c;发现自己对于注解的知识#xff0c;好像只停留在Override。。。异常尴尬#xff0c;所以今天…前言近日在阅读开源项目发现项目里好多奇奇怪怪的注解(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_namekingwan的形式自定义注解的编写规则在开始实战之前我们先了解一下编写自定义注解的规则·注解的定义为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文件。·一些注释可以在运行时进行检查结尾一张图一张思维导图总结一下内容保存下来时常复习