測試開發(fā)必須掌握的重要知識點-Spring的核心知識點 -Java注解@

由@Autowired引發(fā)對注解的思考

我們在編寫Spring應用時,會發(fā)現(xiàn)通過@Autowired來對成員變量、方法和構(gòu)造函數(shù)進行標注進而實現(xiàn)自動裝配的工作,在IDE中點擊@Autowired 看其源碼會發(fā)現(xiàn)里面有更多以@開頭的東東,這就是我們今天講解的重點——Java注解!

@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})

@Retention(RetentionPolicy.RUNTIME)

@Documented

public @interface Autowired {

??? /**

??? ?* Declares whether the annotated dependency is required.

??? ?* <p>Defaults to {@code true}.

??? ?*/

??? boolean required() default true;

}

Java 注解詳解

Java 注解(Annotation)又稱 Java 標注,是 JDK5.0 引入的一種注釋機制。Annotation 是一個輔助類,它在 Junit、Struts、Spring 等工具框架中被廣泛使用。Java 語言中的類、方法、變量、參數(shù)和包等都可以被標注。和 Javadoc 不同,Java 標注可以通過反射獲取標注內(nèi)容。在編譯器生成類文件時,標注可以被嵌入到字節(jié)碼中。Java 虛擬機可以保留標注內(nèi)容,在運行時可以獲取到標注內(nèi)容 。當然它也支持自定義Java 標注。

Java 定義了一套內(nèi)置注解,包括:

@Override - 檢查該方法是否是重寫方法。如果發(fā)現(xiàn)其父類,或者是引用的接口中并沒有該方法時,會報編譯錯誤。

@Deprecated - 標記過時方法。如果使用該方法,會報編譯警告。

@SuppressWarnings - 指示編譯器去忽略注解中聲明的警告。

作用在其他注解的注解(或者說元注解)是:

@Retention - 標識這個注解怎么保存,是只在代碼中,還是編入class文件中,或者是在運行時可以通過反射訪問。這3個生命周期分別對應于:Java源文件(.java文件) ---> .class文件 ---> 內(nèi)存中的字節(jié)碼。

1、RetentionPolicy.SOURCE:注解只保留在源文件,當Java文件編譯成class文件的時候,注解被遺棄;

2、RetentionPolicy.CLASS:注解被保留到class文件,但jvm加載class文件時候被遺棄,這是默認的生命周期;

3、RetentionPolicy.RUNTIME:注解不僅被保存到class文件中,jvm加載class文件之后,仍然存在;

@Documented - 標記這些注解是否包含在用戶文檔中。

@Target - 標記這個注解的作用目標是哪種 Java 成員。

@Target(ElementType.TYPE)——接口、類、枚舉、注解

@Target(ElementType.FIELD)——字段、枚舉的常量

@Target(ElementType.METHOD)——方法

@Target(ElementType.PARAMETER)——方法參數(shù)

@Target(ElementType.CONSTRUCTOR) ——構(gòu)造函數(shù)

@Target(ElementType.LOCAL_VARIABLE)——局部變量

@Target(ElementType.ANNOTATION_TYPE)——注解

@Target(ElementType.PACKAGE)——包

@Inherited - 標記這個注解是繼承于哪個注解類(默認 注解并沒有繼承于任何子類)

從 Java 7 開始,額外添加了 3 個注解:

@SafeVarargs - Java 7 開始支持,忽略任何使用參數(shù)為泛型變量的方法或構(gòu)造函數(shù)調(diào)用產(chǎn)生的警告。

@FunctionalInterface - Java 8 開始支持,標識一個匿名函數(shù)或函數(shù)式接口。

@Repeatable - Java 8 開始支持,標識某注解可以在同一個聲明上使用多次。

自定義注解開發(fā)

接下來,我們來學習如何進行自定義注解的開發(fā)。

使用@interface方式定義一個注解

import? java.lang.annotation.Retention;

import? java.lang.annotation.Target;

import? java.lang.annotation.ElementType;

import? java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.METHOD)

public @interface MyTag{

? String name(); //注解中定義變量name

}


寫一個類,在方法中應用@MyTag

public class TestTag {

??? ?@MyTag(name="case1")

??? ?public void login(){

??????? ?System.out.println("login");

??? ?}

??? ?@MyTag(name="case2")

??? ?public void info(){

??????? ?System.out.println("info");

??? ?}

??? ?@MyTag(name="case3")

??? ?public void logout(){

??????? ?System.out.println("logout");

??? ?}

}?

寫一個測試類,獲取TestTag類login方法中的@MyTag中的name值。前面我們說了很多注解如何定義,放在哪,現(xiàn)在我們可以開始學習注解屬性的提取了,這才是使用注解的關(guān)鍵,獲取屬性的值才是使用注解的目的。獲取注解屬性, 需要使用反射技術(shù)(我會在下面的文章中重點介紹反射),代碼如下:

public static void main(String[] args) throws NoSuchMethodException, SecurityException, ClassNotFoundException {

??????? //裝載類并且對其進行實例化的操作。

? ? ? Class tag = Class.forName("com.my.demo.TestTag");

??????? //調(diào)用login方法(必須是public類型)

? ? ? Method m=tag.getMethod("login");?

? ? ? //返回MyTag類型的注釋

??????? MyTag name=m.getAnnotation(MyTag.class);?

??????? //輸出注釋的名稱

??????? System.out.println("value is: "+name.name());?

??? }

運行代碼,結(jié)果如下:

value is: case1

好了,這就是Java注解的基礎應用,是不是很簡單呢?接下來我還會寫關(guān)于反射技術(shù),以及注解和反射技術(shù)結(jié)合應用的文章,也希望大家持續(xù)關(guān)注。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容