本篇內(nèi)容介紹了“如何理解Java注解”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
成都創(chuàng)新互聯(lián)是專業(yè)的大箐山網(wǎng)站建設(shè)公司,大箐山接單;提供網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè),網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行大箐山網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊,希望更多企業(yè)前來合作!
我們在編寫Spring應(yīng)用時,會發(fā)現(xiàn)通過@Autowired來對成員變量、方法和構(gòu)造函數(shù)進(jìn)行標(biāo)注進(jìn)而實現(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. *Defaults to {@code true}. */ boolean required() default true; }
Java 注解(Annotation)又稱 Java 標(biāo)注,是 JDK5.0 引入的一種注釋機(jī)制。Annotation 是一個輔助類,它在 Junit、Struts、Spring 等工具框架中被廣泛使用。Java 語言中的類、方法、變量、參數(shù)和包等都可以被標(biāo)注。和 Javadoc 不同,Java 標(biāo)注可以通過反射獲取標(biāo)注內(nèi)容。在編譯器生成類文件時,標(biāo)注可以被嵌入到字節(jié)碼中。Java 虛擬機(jī)可以保留標(biāo)注內(nèi)容,在運行時可以獲取到標(biāo)注內(nèi)容 。當(dāng)然它也支持自定義Java 標(biāo)注。
Java 定義了一套內(nèi)置注解,包括:
@Override - 檢查該方法是否是重寫方法。如果發(fā)現(xiàn)其父類,或者是引用的接口中并沒有該方法時,會報編譯錯誤。
@Deprecated - 標(biāo)記過時方法。如果使用該方法,會報編譯警告。
@SuppressWarnings - 指示編譯器去忽略注解中聲明的警告。
作用在其他注解的注解(或者說 元注解)是:
@Retention - 標(biāo)識這個注解怎么保存,是只在代碼中,還是編入class文件中,或者是在運行時可以通過反射訪問。這3個生命周期分別對應(yīng)于:Java源文件(.java文件) ---> .class文件 ---> 內(nèi)存中的字節(jié)碼。
1、RetentionPolicy.SOURCE:注解只保留在源文件,當(dāng)Java文件編譯成class文件的時候,注解被遺棄;
2、RetentionPolicy.CLASS:注解被保留到class文件,但jvm加載class文件時候被遺棄,這是默認(rèn)的生命周期;
3、RetentionPolicy.RUNTIME:注解不僅被保存到class文件中,jvm加載class文件之后,仍然存在;
@Documented - 標(biāo)記這些注解是否包含在用戶文檔中。
@Target - 標(biāo)記這個注解的作用目標(biāo)是哪種 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 - 標(biāo)記這個注解是繼承于哪個注解類(默認(rèn) 注解并沒有繼承于任何子類)
從 Java 7 開始,額外添加了 3 個注解:
@SafeVarargs - Java 7 開始支持,忽略任何使用參數(shù)為泛型變量的方法或構(gòu)造函數(shù)調(diào)用產(chǎn)生的警告。
@FunctionalInterface - Java 8 開始支持,標(biāo)識一個匿名函數(shù)或函數(shù)式接口。
@Repeatable - Java 8 開始支持,標(biāo)識某注解可以在同一個聲明上使用多次。
接下來,我們來學(xué)習(xí)如何進(jìn)行自定義注解的開發(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 }
寫一個類,在方法中應(yīng)用@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)在我們可以開始學(xué)習(xí)注解屬性的提取了,這才是使用注解的關(guān)鍵,獲取屬性的值才是使用注解的目的。獲取注解屬性, 需要使用反射技術(shù)(我會在下面的文章中重點介紹反射),代碼如下:
public static void main(String[] args) throws NoSuchMethodException, SecurityException, ClassNotFoundException { //裝載類并且對其進(jìn)行實例化的操作。 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注解”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!