1. 程式人生 > 實用技巧 >Java註解的簡單應用

Java註解的簡單應用

一.註解的定義

package com.microli.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 {
    String value();
}

@interface 註解名{}

定義時需要新增內建的註解宣告

  @Target:註解能使用在什麼地方,值是ElementType陣列

package java.lang.annotation;

public enum ElementType {
    TYPE,               /* 類、介面(包括註釋型別)或列舉宣告  */

    FIELD,              /* 欄位宣告(包括列舉常量)  */

    METHOD,             /* 方法宣告  */

    PARAMETER,          /* 引數宣告  */

    CONSTRUCTOR,        
/* 構造方法宣告 */ LOCAL_VARIABLE, /* 區域性變數宣告 */ ANNOTATION_TYPE, /* 註釋型別宣告 */ PACKAGE /* 包宣告 */ }

  @Retention:註解資訊儲存的位置,通常使用RetentionPolicy.RUNTIME,可以在執行時獲取其資訊

package java.lang.annotation;
public enum RetentionPolicy {
    SOURCE,            /* Annotation資訊僅存在於編譯器處理期間,編譯器處理完之後就沒有該Annotation資訊了  
*/ CLASS, /* 編譯器將Annotation儲存於類對應的.class檔案中。預設行為 */ RUNTIME /* 編譯器將Annotation儲存於class檔案中,並且可由JVM讀入 */ }

二.註解簡單應用之拼接查詢語句

在框架中一般是使用註解配合反射拼接查詢語句,例如:

1.定義兩個註解,一個代表insert語句中的表名Table,一個代表列名Column(此時值都是String型別)

package com.microli.annotation;

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)
public @interface Table {
    String value();
}
package com.microli.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 {
    String value();
}

2.在JavaPOJO中,添加註解

package com.microli.annotation;

//類註解
@Table("user")
public class User {
    //屬性註解
    @Column("account")
    private String  account;
    @Column("password")
    private String  password;

    public String getAccount() {
        return account;
    }

    public void setAccount(String account) {
        this.account = account;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

3.編寫DAO操作類,新增各種方法傳入JavaPOJO得到對應的Sql語句,此處示例為add方法拼接insert語句做資料庫的增加操作

package com.microli.annotation;

import java.lang.reflect.Field;

public class DAO {
    /**
     * 拼接插入Sql語句
     *
     * @param t   形參(例:user)
     * @param <T> 形參型別(例:User)
     */
    public <T> void add(T t) throws Exception {
        //定義初始sql語句為空字串以便後面拼接
        String sql = "";
        //得到引數 t 的Class類物件 c
        Class c = t.getClass();
        //得到類註解,即查詢的表名
        Table table = (Table) c.getAnnotation(Table.class);
        //如果存在表名註解則取其值value拼接上sql字串注意括號"("的存在
        if (table != null) {
            sql += "insert into " + table.value() + "(";//sql="insert into table(
        }
        //獲取引數實體類中的所有屬性
        Field[] fields = c.getDeclaredFields();
        //迴圈判斷屬性前是否有列名註解,有則取其值value拼接sql字串注意逗號","的存在
        for (Field field : fields) {
            Column column = field.getAnnotation(Column.class);
            if (column != null) {
                sql += column.value() + ",";//sql="insert into table(column1,column2,
            }
        }
        //列名拼接完最後的逗號去除
        sql = sql.substring(0, sql.length() - 1);//sql="insert into table(column1,column2
        //增加拼接sql賦值的字串
        sql += ") values(";//sql="insert into table(column1,column2) values(

        //迴圈取出存在註解的屬性值
        for (Field field : fields) {
            Column column = field.getAnnotation(Column.class);
            if (column != null) {
                //由於屬性是私有,設定可訪問
                field.setAccessible(true);
                //拼接屬性值注意要有對應的單引號
                sql += "'" + field.get(t) + "',";//sql="insert into table(column1,column2) values('value1','value2',
            }
        }
        //值拼接完後最後逗號去除
        sql = sql.substring(0, sql.length() - 1);//sql="insert into table(column1,column2) values('value1','value2'
        //拼接最後的括號")"
        sql += ")";//sql="insert into table(column1,column2) values('value1','value2')
        //得到完整的sql語句
        System.out.println(sql);

    }
}

4.測試

package com.microli.annotation;


public class Test {
    public static void main(String[] args) throws Exception {
        DAO dao = new DAO();
        User user = new User();
        user.setAccount("123");
        user.setPassword("qwe");
        dao.add(user);
    }
}