注解原来是这么一回事儿
来源:互联网 发布:淘宝网儿童女式凉鞋 编辑:程序博客网 时间:2024/05/29 19:47
1.为什么要学习注解
- 能够看得懂别人的代码, 特别是框架相关的代码
- 让编程更加简洁,代码更加清晰
- 让别人高看一眼
2.注解基本概念
注解从java1.5版本提出
java提供了一种原程序中的元素关联任何信息和任何元数据的途径和方法。
3.java中的常见注解
3.1.JDK自带注解
@Override
表示此方法覆盖了父类某方法。
@Deprecated
表示方法已经过时
@SuppressWarnings(“deprecation”)
忽略警告的注解,比如我们使用了如上的过时方法,编译器会给我们提出警告,要忽略特定的警告,就要用此注解。
3.2.常见第三方注解
这里不一一举例
4.注解分类
源码注解:注解只在源码中存在,编译成.class文件就不存在了。
编译时注解:在.class中也会存在(JDK自带注解)
运行时注解:在运行阶段还会起作用,甚至会影响运行逻辑的注解(比如Autowired)
我们大部分打交道的注解都是第三方注解。
还有一类特殊的注解叫元注解,使用来解释注解的注解,在后面展示。
5.自定义注解
5.1 自定义注解的语法要求
基本语法:
5.2 元注解
Target:注解的作用域
Retention:声明注解类型
Inherited:标识子注解可以继承
Documented:生成javadoc时会包含注解
5.3 使用自定义注解
使用注解语法:
5.4 解析注解
通过反射获取类,函数或成员上运行时注解信息,从而实现动态控制程序运行的逻辑。
6.注解使用实例
项目说明:
代替Hibernate的解决方案。
需求:
1.有一张用户表,字段名包括用户ID,用户名,邮箱
2.方便的对每个字段或字段的组合条件进行检索,并打印SQL。
3.使用方式要足够简单.
在query方法中,我们将借助注解来帮助我们自动拼装sql语句。
首先自定义两个注解:
@Table注解:表名和类名的映射
@Column注解:数据库字段和类属性的映射
使用注解:
query方法实现:
private static String query(Filter f) throws Exception { StringBuilder sb = new StringBuilder(); // 获取字节码文件 Class c = f.getClass(); //获取table名 boolean exists = c.isAnnotationPresent(Table.class); if (!exists){ return null; } else { Table t = (Table)c.getAnnotation(Table.class); String tableName = t.value(); sb.append("select * from").append(tableName).append(" where 1=1 "); //遍历所有字段 Field[] declaredFields = c.getDeclaredFields(); for (Field field:declaredFields){ //拼装sql exists = field.isAnnotationPresent(Column.class); if (exists){ //获取字段名 Column column = (Column) field.getAnnotation(Column.class); String columnName = column.value(); //拿到字段值 String fieldName = field.getName(); String getMethodName = "get" + fieldName.substring(0,1).toUpperCase()+fieldName.substring(1); Method getMethod = c.getMethod(getMethodName); Object fieldValue = getMethod.invoke(f, null); //拼装sql if (fieldValue == null || (fieldValue instanceof Integer &&(Integer)fieldValue == 0)){ continue; } if (fieldValue instanceof String) { sb.append(" and ").append(fieldName).append("=").append("'").append(fieldValue).append("'"); } else { sb.append(" and ").append(fieldName).append("=").append(fieldValue); } } } } return sb.toString(); }
最终测试结果:
select * fromuser where 1=1 and id=10
select * fromuser where 1=1 and userName=’lucy’
select * fromuser where 1=1 and email=’mm@qq.com,zh@163.com’
- 注解原来是这么一回事儿
- 原来大熊猫是这么可爱!
- 大学原来是这么美好
- 原来是这么回事
- 原来是这么回事!
- 多线程原来是这么简单
- 原来IntToHex是这么实现的。。。
- 原来是这么简单···
- 原来DIIOP是这么用的!!!
- 原来Localizable AttributeProperty是这么回事呀
- 原来Ipod Touch是这么定位的
- 原来认识一个女孩是这么简单
- SendDlgItemMessage原来是这么用的
- 原来打补丁是这么玩儿。。。diff patch
- 排序算法原来是这么排的
- 原来做选择题是这么的艰难
- "事务"原来是这么回事
- 原来阿里级别是这么定的。。。
- jdbc连接mysql5与连接mysql6
- 树莓派GPIO接口命名规则 A different mode has already been set解决方案
- 网卡的bond模式
- vue.js安装过程(npm安装)
- [C++]vector中的insert、resize和reserve的用法
- 注解原来是这么一回事儿
- 用正则表达式实现查出二进制数是3的倍数
- swunoj 1877 回忆的碎片
- POJ
- 商品展示
- C语言内存管理详解
- centos6.5下搭建MySql集群
- 个人记录《android map》
- HDU 1.2.4