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’