反射读取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

)

 

 

0 0
原创粉丝点击