反射读取annotation
来源:互联网 发布:js获取所有id 像 编辑:程序博客网 时间:2024/06/10 20:30
反射解析Annotation
1 场景描述
模拟hibernate的model映射,生成建表语句。
示例:
create table User(
id varchar(36) constraint User_id_pk primary key,
age number(2),
brithday date
)
2 代码
2.1 创建annotation
只创建table、column,将约束条件constraint合并到column中。
2.1.1 创建table
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
String name() default "";
}
2.1.2 创建column
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
boolean isPK() default false;//是否主键
boolean isNull() default true;//是否允许为空
String name() default "";
int length() default 0;
}
2.2 创建Model,并使用annotation
import java.util.Date;
/**
* 必须使用注解,即便内容为空。
* 使用注解的元素,表示该元素需要读取、解析;否则,忽略
* 注解中的name默认值都是空字符串,如果不设置,表示使用元素的原名称
*
* 预计输出的SQL:
* create table User(
* id varchar(36) constraint User_id_pk primary key,
* age number(2),
* brithday date
* )
*
* @authorYuri
*
*/
@Table
public class User {
@Column(isPK=true,length=36)
private String id;
@Column(length=2)
private Integer age;
@Column
private Date brithday;
setter&getter方法…
}
2.3 解析Annotation,并输出建表语句
import java.lang.reflect.Field;
import org.junit.Test;
public class TestUserAnnotation {
@Test
public void testWriteSql(){
StringBuffer buffer = new StringBuffer();
StringBuffer fieldBuffer = null;
Class<User> clazz = User.class;
Table table = clazz.getAnnotation(Table.class);
if("".equals(table.name())){
buffer.append("create table ").append(clazz.getSimpleName()).append("(").append("\n");
}
Field[] fields = clazz.getDeclaredFields();
for (Field field: fields) {
Column column = field.getAnnotation(Column.class);
if(fieldBuffer ==null){
fieldBuffer = new StringBuffer();
}else{
fieldBuffer.append(",").append("\n");
}
fieldBuffer.append(field.getName());
switch(field.getType().getSimpleName()){
case "String":
fieldBuffer.append(" varchar(");
if(column.length()==0){
fieldBuffer.append(255);
}else {
fieldBuffer.append(column.length());
}
fieldBuffer.append(") ");
constraint(fieldBuffer, clazz, field, column);
;break;
case "Integer":
fieldBuffer.append(" number(");
if(column.length()==0){
fieldBuffer.append(11);
}else {
fieldBuffer.append(column.length());
}
fieldBuffer.append(") ");
constraint(fieldBuffer, clazz, field, column);;break;
case "Date":
fieldBuffer.append(" date ");
constraint(fieldBuffer, clazz, field, column);
break;
}
}
buffer.append(fieldBuffer).append("\n").append(")");
System.out.println(buffer.toString());
}
private void constraint(StringBuffer fieldBuffer, Class<User> clazz,
Field field, Column column) {
if(column.isPK()){
fieldBuffer.append(" constraint ").append(clazz.getSimpleName()).append("_").append(field.getName()).append("_pk primary key");
}
if(!column.isNull()){
fieldBuffer.append(" not null ");
}
}
}
3 实际输出
create table User(
id varchar(36) constraint User_id_pk primary key,
age number(2) ,
brithday date
)
- 反射读取annotation
- 利用反射reflection读取注释Annotation
- Annotation--反射与Annotation
- 反射应用(读取war包、jar包里的类,获得annotation的值)
- 反射取得Annotation
- Annotation--学习:反射得到annotation详细信息
- Annotation成员的读取
- java反射——反射Annotation
- java(9)反射机制/Annotation
- 使用反射来解析Annotation
- 正则表达式、线程、反射Annotation
- Java反射中Annotation的
- 浅谈Java反射与Annotation
- Java反射01 反射_Class 反射_Method Annotation
- Java Annotation详解(二): 反射和Annotation
- Java从入门到精通 - 反射Annotation
- swing 反射Annotation方式添加事件Listener
- java学习脚印: 反射与注释(Annotation)
- java transient 详解
- java读取jar包中文件
- arcgis中ArcMAP下栅格图象矢量化的步骤
- spark on yarn日志切割
- 获取已安装或未安装的apk签名
- 反射读取annotation
- PHP安装MongoDB扩展驱动
- matlab矩阵复制函数:repmat
- jquery datatables插件兑现表头固定内容可滚动列表
- IOS保存数据的4种方式
- 读懂这些数据,让你的简历有回应
- 熟练使用IText
- java 的深拷贝浅拷贝
- Android framework系统默认设置修改