java自定義註解

自定義註解

之前看過別人寫的照着寫了一份,馬上就忘記了,現在整理一下以備後忘:

  • 自定義註解
  • 建表語句

命名一個表名註解

package com.wx.DataBaseUtil.CustomAnnotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.TYPE)//加載在類或者註解上
@Retention(RetentionPolicy.RUNTIME)// 註解會在class字節碼文件中存在,在運行時可以通過反射獲取到
public @interface Table {

    public String tableName();

}

命名一個表示字段的註解

package annotation;

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 {

    public String field() ; //字段名稱
    public boolean primaryKey() default false;//是否爲主鍵
    public String type() default "VARCHAR(80)";//字段類型
    public boolean defaultNull() default true; //是否允許爲空



}

注意,這裏自定義註解生效的方法是在註解上添加@Target @Retention
各自的作用閾:
4@Retention(RetentionPolicy.SOURCE) //註解僅存在於源碼中,在class字節碼文件中不包含
@Retention(RetentionPolicy.CLASS) // 默認的保留策略,註解會在class字節碼文件中存在,但運行時無法獲得
@Target:註解的作用目標
@Target(ElementType.TYPE) //接口、類、枚舉、註解
@Target(ElementType.FIELD) //字段、枚舉的常量
@Target(ElementType.METHOD) //方法
@Target(ElementType.PARAMETER) //方法參數
@Target(ElementType.CONSTRUCTOR) //構造函數
@Target(ElementType.LOCAL_VARIABLE)//局部變量
@Target(ElementType.ANNOTATION_TYPE)//註解
@Target(ElementType.PACKAGE) ///包
@Document:說明該註解將被包含在javadoc中
@Inherited:說明子類可以繼承父類中的該註解`

數據表工具類:TableUtils

package com.wx.DataBaseUtil.commonUtil;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;

import com.wx.DataBaseUtil.CustomAnnotation.Column;
import com.wx.DataBaseUtil.CustomAnnotation.Table;

public class TableSql {

    public  String getCreateTableSql(Class<?> clazz){

        StringBuilder sb=new StringBuilder();

        Table table=clazz.getAnnotation(Table.class);
        String tableName=table.tableName();

        sb.append("DROP TABLE IF EXISTS ").append(tableName).append(";\n");

        sb.append("CREATE TABLE ").append(tableName).append("(").append("\n");

        //由於字段不可能只有一個 所以 先得到所有的字段
        Field[] field=clazz.getDeclaredFields();
        for (int i = 0; i < field.length; i++) {
            Column column=field[i].getAnnotation(Column.class);
            String columnName=column.columnName();
            String type=column.type();
            boolean defaultNull=column.defaultNull();
            boolean primaryKey=column.primaryKey();
            sb.append(columnName).append("\t").append(type+"\t");
            if(primaryKey){
                sb.append("PRIMARY Key ");
            }
            if(defaultNull){
                sb.append("DEFAULT NULL ,\n");
            }else{
                sb.append("NOT NULL ,\n");
            }
        }

        sb.append("\n) DEFAULT CHARSET=utf8");

        return sb.toString();

    }

}

::::::getAnnotation(); 取得該類的信息

  1. Table table=clazz.getAnnotation(Table.class);
  2. Column column=field[i].getAnnotation(Column.class);

由於字段不可能只有一個 所以 先得到所有的字段

  1. 註解加載類上 使用@Target(ElementType.TYPE),使用時通過反射
    註解類 註解類對象=clazz.getAnnotation(類.class);
  2. 註解加載在字段上 , 使用
    Field[] fields=clazz.getDeclaredFields();
    註解類 註解類對象=field.getAnnotation(註解類 .class);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章