annotation
JDK1.5 后有一个性特性,注解:java.lang.annotation包。
平时我们可能会用到它来规避一些警告、使代码通过编译。
注解--->java中的元数据:修饰数据的数据。使用自定义注解需要注意到:
1. 修饰类的注解必须通过字节码去获取;
2. 修饰方法的注解必须通过Method对象获取;
3. 修饰成员变量的注解必须通过Field对象获龋
下面展示一个利用注解拼接sql语句的示例:
自定义的annotation Column,用于修饰成员变量
1
2
3
4
5
6
7
8
9
10
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.FIELD)//修饰成员变量的注解
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
String getColunmName();
}
自定义的annotation Entity,用于修饰类
1
2
3
4
5
6
7
8
9
10
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.TYPE)//标识注解的type
@Retention(RetentionPolicy.RUNTIME)
public @interface Entity {
String getTableName();
}
Student 类,被自定义注解修饰的实体类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
@Entity(getTableName="exam_student")//被自定义注解Entity修饰的类
public class Student {
@Column(getColunmName="stu_name")//被自定义注解Column修饰的成员变量
private String name;
private int age;
@Column(getColunmName="stu_no")///被自定义注解Column修饰的成员变量
private String no;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getNo() {
return no;
}
public void setNo(String no) {
this.no = no;
}
}
Session 类,利用反射机制拼接sql语句的工具类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import java.lang.reflect.Field;
public class Session {
public String getSql(Object obj){
StringBuilder builder = new StringBuilder();
builder.append("insert into ");
Class<? extends Object> c = obj.getClass();
String simpleName = c.getSimpleName();
if(c.isAnnotationPresent(Entity.class)){
Entity entity = (Entity)c.getAnnotation(Entity.class);
simpleName = entity.getTableName();//获取到Student的类修饰属性 @Entity(getTableName="exam_student")里的exam_student
}
builder.append(simpleName).append("(");
Field[] fs = c.getDeclaredFields();
for(int i = 0; i < fs.length;i++){
//builder = i==0 ? builder.append(fs[i].getName()) : builder.append(",").append(fs[i].getName());
String coloumnName = fs[i].getName();
if(fs[i].isAnnotationPresent(Column.class)){
Column col = fs[i].getAnnotation(Column.class);
coloumnName = col.getColunmName();//获取到Student的成员变量修饰属性getColunmName="stu_name"和getColunmName="stu_no"
}
builder = i==0 ? builder.append(coloumnName) : builder.append(",").append(coloumnName);
}
builder.append(") values").append(getString(fs.length));
return builder.toString();
}
public String getString(int length){
StringBuilder builder = new StringBuilder();
builder.append("(");
for(int i = 0; i < length;i++){
builder = i==0 ? builder.append("?") : builder.append(", ?");
}
builder.append(")");
return builder.toString();
}
}
SessionTest 测试类
1
2
3
4
5
6
7
8
9
10
11
12
13
package lu.a.lu;
public class SessionTest {
/**
* @param args
*/
public static void main(String[] args) {
Session session = new Session();
System.out.println(session.getSql(new Student()));
}
}
以上是完整的test例子,自定义注解在平时应用中并不常用。在Java web端后台开发架构时可能会用到。