java實現自定義註解

不管開發web仍是後端,都會常常和spring打交道,而使用最頻繁的固然是註解。咱們在享受spring註解帶來的方便的同時,是否想過可否實現本身的註解呢?咱們經過java的原生態類就能夠作到這點,咱們主要關注java.lang.annotation。java

如下是實現的代碼,註解已經很詳細了。這裏咱們主要考慮,自定義註解能夠幹什麼?web

咱們能夠利用自定義註解來無縫切換數據庫,好比說定義一個@datasource的註解,而後作一個aop,在調用方法時,例如反射機制讀取數據源的名稱,而後作一個threadlocal來切換數據源,是否是很方便。關於數據源的切換,下一章介紹。spring

/**
 * 描述: 自定義註解
 * 版本號: 1.0
 * 日期: 2017/2/20 16:47
 * 做者: 屠蘇
 *  <ul>@Target:表示該註解能夠用於什麼地方,可能的ElementType參數:</ul>
 *      <li>CONSTRUCTOR:構造器的聲明</li>
 *      <li>LOCAL_VARIABLE:局部變量聲明</li>
 *      <li>METHOD:方法聲明</li>
 *      <li>PACKAGE:包聲明 PARAMETER:參數聲明</li>
 *      <li>TYPE:類、接口(包括註解類型)或enum聲明</li>
 *
 *  <ul>@Retention:表示須要在什麼級別保存該註解信息。可選的RetentionPolicy參數包括:</ul>
 *      <li>SOURCE:註解將被編譯器丟棄</li>
 *      <li>CLASS:註解在class文件中可用,但會被JVM丟棄</li>
 *      <li>RUNTIME:JVM將在運行期間保留註解,所以能夠經過反射機制讀取註解的信息。(經常使用)</li>
 *
 *  <ul>@Document:將註解包含在Javadoc中</ul>
 *
 *  <ul>@Inherited:容許子類繼承父類中的註解</ul>
 *
 *  <ul>注意:</ul>
 *  <li>註解能夠設定初始值,使用default就能夠實現。</li>
 *  <li>註解只有一個元素的時候,該元素名稱必須是value,而且在使用該註解的時候能夠省略」value=」。</li>
 *  <li>註解的值必須是肯定的,且不能使用null做爲值。</li>
 *  <li>註解可能的類型:全部基本類型、String、Class、enum、Annotation、以上類型的數組形式。</li>
 */
@Target({ElementType.METHOD, ElementType.TYPE, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface SelfNote {
    String id();
    String note() default "hello";
}
package com.dlb.annotation;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * 描述: 使用自定義註解
 * 版本號: 1.0
 * 日期: 2017/2/20 16:53
 * 做者: 屠蘇
 */
@SelfNote(id = "no", note = "note")
public class Note {
    @SelfNote(id = "no1", note = "note1")
    private String name;

    @SelfNote(id = "no2", note = "note2")
    public void setName(String name) {
        this.name = name;
    }

    /**
     * main
     * @param args
     * @throws Exception
     */
    public static void main(String []args) throws Exception{
        String classReference = "com.dlb.annotation.Note";
        Class<?> cls = Class.forName(classReference);

        // 獲取類
        boolean b = cls.isAnnotationPresent(SelfNote.class);

        if (b) {
            SelfNote annotation = cls.getAnnotation(SelfNote.class);
            System.out.println(annotation.id() + "," + annotation.note());
        }

        // 獲取字段
        Field[] declaredFields = cls.getDeclaredFields();

        for (Field field : declaredFields) {
            boolean isFieldAn = field.isAnnotationPresent(SelfNote.class);

            if (isFieldAn) {
                SelfNote annotation = field.getAnnotation(SelfNote.class);

                System.out.println(annotation.id() + "," + annotation.note());
            }
        }

        // 獲取方法
        Method[] methods = cls.getMethods();

        for (Method method : methods) {
            boolean is = method.isAnnotationPresent(SelfNote.class);

            if (is) {
                SelfNote annotation = method.getAnnotation(SelfNote.class);

                System.out.println(annotation.id() + "," + annotation.note());
}
        }
    }
}
相關文章
相關標籤/搜索