很多框架都是利用反射和注解从而简化配置。那么它是一个怎么的原理呢?这里我就以创建表为例,介绍一下如何利用反射和注解从而生成SQL语句。
1.先自定义两个注解XgcField和XgcTable
XgcTable
package com.xgc.test.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(value= {ElementType.TYPE} )
@Retention(RetentionPolicy.RUNTIME)
public @interface XgcTable {
String value();
}
复制代码
XgcField
package com.xgc.test.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(value= {ElementType.FIELD} )
@Retention(RetentionPolicy.RUNTIME)
public @interface XgcField {
String columnName();
String type();
int length();
}
复制代码
2.使用注解配置信息
Student.java
package com.xgc.test.annotation;
@XgcTable("tb_student")
public class Student {
@XgcField(columnName="id",type="int",length=10)
private int id;
@XgcField(columnName="name",type="varchar",length=10)
private String name;
@XgcField(columnName="age",type="int",length=3)
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
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;
}
}
复制代码
3.读取注解信息,获得表名,字段的信息,然后拼接成SQL语句
package com.xgc.test.annotation;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
/**
* 使用反射读取注解的信息,模拟处理注解信息的流程
* @author XGC
*
*/
public class Demo01 {
public static void main(String[] args) {
try {
Class clazz=Class.forName("com.xgc.test.annotation.Student");
//获取类的所有有效注解
Annotation[] annotation=clazz.getAnnotations();
for(Annotation a:annotation) {
System.out.println(a);
}
//获取类的指定注解
Field f=clazz.getDeclaredField("name");
XgcField xgcField=f.getAnnotation(XgcField.class);
System.out.println(xgcField.columnName());
//根据获取到的表名,字段的信息,拼接出DDL语句。
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
}
}
}
复制代码