1. 程式人生 > >自定義註解實現--簡單理解版

自定義註解實現--簡單理解版

一、背景知識
XML方案的配置可以說讓人眼花繚亂,如網站開發時用到的web.xml,Mybatis的配置xml,Spring的Beans.xml,常常是滿滿的一大頁,配置和排錯都很不容易。但是從JDK5.0版本開始引入的Annotation(註解)就可以幫助程式開發人員擺脫這種繁重的配置,同時使元資料和想要配置的類捆綁在一起,一定程度上減輕了錯誤的發生。(ps:註解就是元資料,即一種描述資料的資料,也可以理解為註解就是原始碼的元資料,它定義了一種標準的描述元資料的方式,使用較方便)
本人在學習註解的時候,是先學會註解的使用,發現對於註解還是不太瞭解,於是開始通過網上的資料學習自定義註解的實現。
首先,在自定義註解之前,我們需要了解註解的常見型別和元註解(非常重要,負責註解其他註解),常見型別有3種,Override(表示將父類的方法重寫–階段是SOURCE)、SuppressWarnings(在程式前面加上可以在javac編譯中去除警告–階段是SOURCE)、Deprecated(帶有標記的包,方法,欄位說明其過時,但是仍可以使用—-階段是SOURCE)。
元註解主要有Target(用於描述註解的使用範圍)、Retention(用於描述註解的生命週期)、Documented(描述其它型別的annotation應該被作為被標註的程式成員的公共API,因此可以被例如javadoc此類的工具文件化。Documented是一個標記註解,沒有成員)和Inherited(闡述了某個被標註的型別是被繼承的)。詳情看下圖:
這裡寫圖片描述

主要是Target和Retention兩個元註解比較重要,一個表示適用範圍,如方法,屬性,變數等等,另一個就是決定註解在哪個時期起作用,是編碼時期,還是編譯時期,還是執行時期。

最後在瞭解一下自定義註解的相關內容,就可以動手實現了。請看下圖
這裡寫圖片描述

二、程式碼實現
1.自定義的註解Car_color

package tes.annotation;
import static java.lang.annotation.ElementType.CONSTRUCTOR;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang
.annotation.ElementType.TYPE; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.FIELD) //表示這個註解的只適用於屬性,也可以寫多個({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE}) @Retention(RetentionPolicy.RUNTIME
) //表示註解只在執行期起作用 public @interface Car_color { String color() default "白色"; //color方法其實是聲明瞭一個配置引數 //返回值String就是引數的型別,只能是基本型別 //這裡用default預設引數是“白色” }

2.物件類Car

package tes.annotation;

public class Car {
    @Car_color(color="黑色") //使用自定義註解,這裡也可以自己定義color的值
    private String color;

}

3.測試類(Java裡專門的註解資訊處理流程,主要是利用反射機制,可以自動實現註解,而我們自定義的註解想要使用,就必須自定義一個註解流程才能使用,不然就會失去作用,相當於一個註釋)

package tes.annotation;

import java.lang.reflect.Field;

public class Test {
    public static void main(String[] args) throws ClassNotFoundException {
        Class cls=Class.forName("tes.annotation.Car");  //獲取類物件
        Field[] field=cls.getDeclaredFields();          //獲取類的屬性陣列
        for(Field f:field){                             //迴圈屬性
            if(f.isAnnotationPresent(Car_color.class)){ //獲取屬性的註解,並判斷是否是Car_color.class註解
                Car_color car=f.getAnnotation(Car_color.class);     //獲取Car_color註解物件
                System.out.println("汽車顏色:"+car.color());            //輸出註解的color配置引數
            }
        }
    }
}

4.執行結果
這裡寫圖片描述

哈哈,有點懶惰,就只寫了一個註解,希望能對你有所幫助!!!