Annotation注解初识
注解本质上就是一个接口,该接口默认继承Annotation接口
元注解
元注解的作用就是描述其他注解。Java1.5定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明。Java1.5定义的元注解有以下几种:
- @Target
- @Retention
- @Documented
- @Inherited
@Target
用于描述注解的范围,即注解在哪用。它说明了Annotation所修饰的对象范围:Annotation可被用于 packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)等。取值类型(ElementType)有以下几种:
- CONSTRUCTOR:用于描述构造器
- FIELD:用于描述域即类成员变量
- LOCAL_VARIABLE:用于描述局部变量
- METHOD:用于描述方法
- PACKAGE:用于描述包
- PARAMETER:用于描述参数
- TYPE:用于描述类、接口(包括注解类型) 或enum声明
- TYPE_PARAMETER:1.8版本开始,描述类、接口或enum参数的声明
- TYPE_USE:1.8版本开始,描述一种类、接口或enum的使用声明
@Retention
用于描述注解的生命周期,表示需要在什么级别保存该注解,即保留的时间长短。取值类型(RetentionPolicy)有以下几种:
- SOURCE:在源文件中有效(即源文件保留)
- CLASS:在class文件中有效(即class保留)
- RUNTIME:在运行时有效(即运行时保留)
@Documented
用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。它是一个标记注解,没有成员。
@Inherited
用于表示某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。
通过注解实现生成对应的SQL语句
@Target({ElementType.FIELD})//表示作用域是字段
@Retention(RetentionPolicy.RUNTIME)//生命周期为运行时
public @interface Column { String value();
}
@Table("user")
public class Filer { @Column("id")
private int id; @Column("userName")
private String userName; @Column("nickName")
private String nickName; @Column("age")
private int age; @Column("city")
private String city; @Column("email")
private String email;
//省略getter,setter
}
/*
* 通过注释得到sql语句
*/
public class Test {
public static String query(Object f) {
StringBuilder sb = new StringBuilder();
// 获取到f的class对象
Class<?> c = f.getClass();
// 判断是否存在注释
boolean tableExists = c.isAnnotationPresent(Table.class);
if (!tableExists) {
return null;
}
// 获取Table 注释中的数据
Table table = (Table) c.getAnnotation(Table.class);
String tableValue = table.value();
sb.append("select * from " + tableValue + " where 1=1");// 初始化sql语句防止报错
// 遍历所有的字段
//由于字段的修饰符为private,使用getDeclaredFields()获取
Field[] fields = c.getDeclaredFields();
for (Field field : fields) {
boolean columnExists = field.isAnnotationPresent(Column.class);
if (!columnExists) {
continue;
}
// 获取Column 注释中的数据(字段)
Column column = field.getAnnotation(Column.class);
String columnValue = column.value();
// 获取的方法名字
String getMethodName = "get" + field.getName().substring(0, 1).toUpperCase() + field.getName().substring(1);
// 通过反射调用get方法(获取字段值)
Object fieldValue = null;
try {
Method getMethod = c.getMethod(getMethodName);
fieldValue = getMethod.invoke(f);
} catch (Exception e) {
e.printStackTrace();
}
// 拼装sql
if (fieldValue instanceof String && (String) fieldValue != null
|| fieldValue instanceof Integer && (Integer) fieldValue != 0) {
if (fieldValue instanceof String) {
if (((String) fieldValue).contains(",")) {
String[] values = ((String) fieldValue).split(",");
sb.append(" in(");
for (String value : values) {
sb.append("'").append(value).append("',");
}
sb.deleteCharAt(sb.length() - 1);
sb.append(")");
} else {
sb.append(" and ").append(columnValue + "='" + fieldValue + "'");
}
} else if (fieldValue instanceof Integer) {
sb.append(" and ").append(columnValue + "=" + fieldValue);
}
}
}
return sb.toString();
} public static void main(String[] args) {
Filer f1 = new Filer();
f1.setId(10);// 查询id为10的用户
f1.setAge(16); Filer f2 = new Filer();
f2.setUserName("lucy");// 查询用户为lucy的用户 Filer f3 = new Filer();
f3.setEmail("liu@qq.com,zh@163.com,7777@sina.com");// 查询email为其中任何一个 String sql1 = query(f1);
String sql2 = query(f2);
String sql3 = query(f3); System.out.println(sql1);
System.out.println(sql2);
System.out.println(sql3);
}
}
/*select * from user where 1=1 and id=10 and age=16*/
/*select * from user where 1=1 and userName='lucy'*/
/*select * from user where 1=1 in('liu@qq.com','zh@163.com','7777@sina.com')*/
Annotation注解初识的更多相关文章
- Java Annotation 注解
java_notation.html div.oembedall-githubrepos { border: 1px solid #DDD; list-style-type: none; margin ...
- Hibernate的Annotation注解
当项目变得比较大的时候,如何还使用hbm.xml文件来配置Hibernate实体就会变得比较复杂.这里Hibernate提供了Annotation注解方式,使得Hibernate的映射文件变得很方便管 ...
- Java基础笔记 – Annotation注解的介绍和使用 自定义注解
Java基础笔记 – Annotation注解的介绍和使用 自定义注解 本文由arthinking发表于5年前 | Java基础 | 评论数 7 | 被围观 25,969 views+ 1.Anno ...
- paip.Java Annotation注解的作用and 使用
paip.Java Annotation注解的作用and 使用 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog. ...
- hibernate annotation注解方式来处理映射关系
在hibernate中,通常配置对象关系映射关系有两种,一种是基于xml的方式,另一种是基于annotation的注解方式,熟话说,萝卜青菜,可有所爱,每个人都有自己喜欢的配置方式,我在试了这两种方式 ...
- Android开发学习之路--Annotation注解简化view控件之初体验
一般我们在写android Activity的时候总是会在onCreate方法中加上setContentView方法来加载layout,通过findViewById来实现控件的绑定,每次写这么多代码总 ...
- java EE中的hello1.java及Annotation(注解)
一.Annotation(注解) 注解(Annotation)很重要,未来的开发模式都需要注解,注解是java.lang.annotation包,Annotation是从java5引入的,它提供一些不 ...
- Annotation(注解)介绍
Annotation(注解)是什么: Annotation(注解) 官方的定义: An annotation is a form of metadata, that can be added t ...
- Hibernate 零配置之Annotation注解
JPA规范推荐使用Annotation来管理实体类与数据表之间的映射关系,从而避免同时维护两份文件(Java 实体类 和 XML 映射文件),将映射信息(写在Annotation中)与实体类集中在一起 ...
随机推荐
- 《Kafka笔记》4、Kafka架构,与其他组件集成
目录 1 kafka架构进阶 1.1 Kafka底层数据的同步机制(面试常问) 1.1.1 高水位截断的同步方式可能带来数据丢失(Kafka 0.11版本前的问题) 1.1.2 解决高水位截断数据丢失 ...
- 万字长文深入理解java中的集合-附PDF下载
目录 1. 前言 2. List 2.1 fail-safe fail-fast知多少 2.1.1 Fail-fast Iterator 2.1.2 Fail-fast 的原理 2.1.3 Fail- ...
- mock.js 学习
安装 npm install mockjs 使用 // 引入 import Mock from 'mockjs' Mock.setup({ timeout: '200 - 400' }) const ...
- Zeal(文档)安装使用
Zeal是一个为软件开发者提供的离线文档浏览器. 一.下载安装 下载地址:https://zealdocs.org/ 二.安装后下载自己需要的文档 1.通过Zeal原生源直接下载文档 Tools -& ...
- UI自动化测试不稳定的因素
1.进行测试的时候,经常会有一些无法预测的弹框出现: 2.页面很多元素是会动态变化的: 3.进入页面时,经常会因为网络等一些原因,使得页面元素加载延迟: 4.数据变更.
- STM32入门系列-STM32时钟系统,STM32时钟树
时钟对于单片机来说是非常重要的,它为单片机工作提供一个稳定的机器周期从而使系统能够正常运行.时钟系统犹如人的心脏,一旦有问题整个系统就崩溃.我们知道STM32属于高级单片机,其内部有很多的外设,但不是 ...
- k8s中pod的yaml文件全面解读
apiVersion: v1 #必选,版本号,例如v1,版本号必须可以用 kubectl api-versions 查询到 . kind: Pod #必选,Pod metadata: #必选,元数据 ...
- python类变量与成员变量
类变量与成员变量 关注公众号"轻松学编程"了解更多. 在类中声明的变量我们称之为类变量[静态成员变量], 在__init__()函数中声明的变量并且绑定在实例上的变量我们称之为 ...
- Reactor:深入理解reactor core
目录 简介 自定义Subscriber Backpressure处理 创建Flux 使用generate 使用create 使用push 使用Handle 简介 上篇文章我们简单的介绍了Reactor ...
- 【QT】继承QRunnable+QThreadPool实现多线程
往期链接: <QThread源码浅析> <子类化QThread实现多线程> <子类化QObject+moveToThread实现多线程> 本文章实例的源码地址:ht ...