一个Java例子,解释清楚注解的作用

写在前面

今天聊的是注解,但其实单纯说注解,注解本身没有任何的作用。简单说和注释没啥区别,而它有作用的原因是:注解解释类,也就是相关对代码进行解释的特定类。一般这些类使用反射是可以拿到的。

因此,通过注解和反射这两者的结合使用,是可以做到很多功能的。不知道各位小伙伴有没有留意过,很多框架都是使用了注解。如果再深入的看一看源码就会发现,很多注解是和反射一起使用的。

因此今天咱们也让通过注解+反射,写一个简单的ORM框架,效果是通过注解的方式快速生成SQL语句。

正文

首先是注解类:Table,Column(分别代表:表和列)

image

话外音

@Target:用于描述注解的使用范围(即:被描述的注解可以用在什么地方)注解(annotation)可被用于 packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)。在注解类型的声明中使用了target可更加明晰其修饰的目标。取值(ElementType)有:

ElementType.ANNOTATION_TYPE 可以应用于注释类型。ElementType.CONSTRUCTOR 可以应用于构造函数。ElementType.FIELD 可以应用于字段或属性。ElementType.LOCAL_VARIABLE 可以应用于局部变量。ElementType.METHOD 可以应用于方法级注释。ElementType.PACKAGE 可以应用于包声明。ElementType.PARAMETER 可以应用于方法的参数。ElementType.TYPE 可以应用于类的任何元素。

@Retention:@Retention定义了该注解被保留的时间长短:某些注解仅出现在源代码中,而被编译器丢弃;而另一些却被编译在class文件中;编译在class文件中的注解可能会被虚拟机忽略,而另一些在class被装载时将被读取(请注意并不影响class的执行,因为注解与class在使用上是被分离的)。使用这个meta-Annotation可以对注解的“生命周期”限制。作用:表示需要在什么级别保存该注释信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效)  取值(RetentionPoicy)有:

1.SOURCE:在源文件中有效(即源文件保留)2.CLASS:在class文件中有效(即class保留)3.RUNTIME:在运行时有效(即运行时保留)

PS:注解只有一个成员时,按规范写成value(),当然不这么写不会报错。如果不设置默认值,那么使用注解时必须要传值。只有类可以被注解,因为接口或者抽象类并不能被注解。

回归正文

紧接着是注解的使用类:Person(就是一个使用注解的Java bean)

image

PS:如果有两个以上参数:必须这么使用@Column(value="user_name")

核心方法

写一个通过对象生成查询SQL语句的方法。先声明一下,这种写法没有太大的时机意义。只是举例说明一下反射操作注解的一种思想:

image

方法使用

在main方法中的使用:

image

运行效果,可能很多小伙伴已经猜到啦,就是打印出一个query的SQL语句:

image

实话实说,这样写没什么卵用。但是我们可以通过这个小demo管中窥豹,举一反三。比如可以在库中写一个工具类,直接调用这个工具类,传递所需的参数,返回最终拼接的sql语句,这样就能够做到不会需要考虑SQL语句拼不拼错了,除非你自己写错,否则不会出现任何的语句错误。

剧终

你可能感兴趣的:(一个Java例子,解释清楚注解的作用)