深入理解Java註解之:註解的使用

来源:http://www.cnblogs.com/kingcode/archive/2017/07/19/7203568.html
-Advertisement-
Play Games

註解是jdk1.5新增的特性.大家都知道,jdk1.5在java的發展史上有著劃時代的意義.而註解的出現,在某種程度上顛覆了框架的設計.比如,spring在註解出現後,改善了原先五大組件的模式,增加了基於註解的實現方式.現在重點講講註解的使用. 元註解: jdk1.5定義了4個元註解,元註解的作用是 ...


        註解是jdk1.5新增的特性.大家都知道,jdk1.5在java的發展史上有著劃時代的意義.而註解的出現,在某種程度上顛覆了框架的設計.比如,spring在註解出現後,改善了原先五大組件的模式,增加了基於註解的實現方式.現在重點講講註解的使用.

       元註解:

      jdk1.5定義了4個元註解,元註解的作用是註解其他的註解.

       1.@Retention

       2.@Target

       3.@Documented

       4.@Inherited

       @Retention用於指明該註解存在的時機.參數有三個值可選:RetentionPolicy.SOURCE,RetentionPolicy.CLASS,RetentionPolicy.RUNTIME可供選擇.分別表示:源碼中保留註解,位元組碼文件中保留註解,運行時保留註解.

       @Target用於指明註解能作用的範圍.比如參數中設置為ElementType.TYPE,表示作用於類和介面.如果你用來註解方法,則會發生編譯錯誤.由此可見它的功能是通過編譯器實現的.

       @Documented表明該註解在使用javadoc工具生成開發文檔時,也會被納入進去.

       @Inherited表明,某個位置使用該註解,那麼在存在Java繼承關係的地方,該註解也能被繼承過來.這個可能不好理解.下麵的代碼加以說明.

       

1 @Retention(RetentionPolicy.RUNTIME)
2 @Target({ElementType.TYPE,ElementType.METHOD})
3 @Inherited
4 public @interface AnnoInherited {
5     
6 }

       測試代碼:

 1 public class TestAnnoInherated {
 2     public static void main(String[] args) {
 3         Annotation[] annos=new Goo().getClass().getAnnotations();
 4         for(Annotation a:annos){
 5             System.out.println(a);
 6         }
 7     }
 8 }
 9 
10 @AnnoInherited
11 class Foo{
12     
13 }
14 
15 class Goo extends Foo{
16     
17 }

        控制台輸出:

@test.annotation.AnnoInherited()

        上例中Goo前面並沒有加註解@AnnoInherited,但是父類Foo前面有,而@AnnoInherited加了元註解@Inherited,所以Foo能繼承過來.

        自定義註解:

        自定義註解的實例如下.

package test.annotation;

import java.lang.annotation.Documented;
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)
@Documented
public @interface AnimalInfo {
    String shout() default "";
    
    //能不能看門
    boolean isGuard() default true;
}

 

         測試代碼:

public class TestAnimalInfo {
    public static void main(String[] args) {
        Animal animal=new Animal();
        AnimalInfo info=animal.getClass().getAnnotation(AnimalInfo.class);
        if(info!=null){
            Annotation anno=info;//此處並沒有報錯.Annotation是一個介面.info是一個註解.這是因為編譯器會將註解編譯成介面,並且繼承了Annotation
            System.out.println("Annotation類信息:"+Annotation.class);
            System.out.println("AnimalInfo類信息:"+AnimalInfo.class);
            Class[] cs=AnimalInfo.class.getInterfaces();
            for(Class c:cs){
                System.out.println(c);  //AnimalInfo編譯後就是一個介面,並且繼承了Annotation,這裡得到了證實.
            }
            System.out.println("info對象的類信息:"+info.getClass());
            if("wangwang".equals(info.shout())&&info.isGuard()){
                System.out.println("the animal is a dog");
            }else if("miaomiao".equals(info.shout())&&!info.isGuard()){
                System.out.println("the animal is a cat");
            }else{
                System.out.println("the animal is not a dog or cat");
            }
        }else{
            System.out.println("it's not a animal");
        }
    }
}

@AnimalInfo(shout="wangwang",isGuard=true)
class Animal{
    
}

         控制台輸出:

Annotation類信息:interface java.lang.annotation.Annotation
AnimalInfo類信息:interface test.annotation.AnimalInfo
interface java.lang.annotation.Annotation
info對象的類信息:class com.sun.proxy.$Proxy1
the animal is a dog

         代碼分析:從控制台可以看到.@AnimalInfo註解其實編譯後就是介面,並且它繼承了Annnotation.而通過反射獲得的註解實例,名字為$Proxy1,是一個類的對象.可見,該註解實例是JVM通過動態代理技術生成的.這也揭示了註解特性的底層實現原理.關於註解的具體底層技術原理,這裡不再詳談.

 

              


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 英文平時連終端的都是用SecureCRT, 今天試了一些SecureFX, 結果亂碼了, 把redhat下的中文桌面標題顯示亂碼, 然後參考了一下別的前輩, 完美解決, 下麵是解決辦法:1.找到配置文件(安裝目錄) 這個是我的C:\Program Files\SecureCRSecureFXPort... ...
  • 為了更方便管理伺服器,CRT一個功能非常方便。那就是可以使用私鑰認證通過後直接連接,而且對於密碼保護比較安全一點。 首先配置ssh Port 32812Protocol 2UseDNS noPubkeyAuthentication yesAuthorizedKeysFile .ssh/authori ...
  • 輸入read用途:從標準輸入讀取一行,或者從文件描述符FD(file descriptor)中讀取一行,並且將其分割成欄位。   輸出(echo)用途 :在標準輸出上輸出傳遞過來的內容。 ...
  • 正題前的嘮叨 本人是才出來工作不久的小白菜一顆,技術很一般,總是會有遇到一些很簡單的問題卻不知道怎麼做,這些問題可能是之前解決過的。發現這個問題,想著提升一下自己的技術水平,將一些學的新的‘好’東西記錄下來,一是加深印象;二是以後可以作為參考;三是希望博友們可以提出不足和可以優化的地方,一起討論。 ...
  • 眾所周知,我們在寫程式的時候,好習慣是在重要的代碼打上日誌。以便監控程式運行的性能和記錄可能發生的錯誤。但是,如果日誌是基於同步IO文件操作,那麼就必須考慮到訪問總次數或併發數目。如果總次數或併發數目非常大,比如10W或者1K/s 或更多,那麼就要註意IO的同步性能對程式速度的拖慢效應了。 這個時候 ...
  • 本期同樣帶給大家分享的是阿笨在實際工作中遇到的真實業務場景,請跟隨阿笨的視角去如何採用基於開源組件SmartThreadPool線程池技術實現多任務批量處理。在工作中您是否遇到過如何快速高效的處理Job任務列表、如何通過多線程批量處理訂單、如何多線程群發簡訊、如何批量上傳圖片到遠程圖片伺服器或者雲存... ...
  • 最近單位開發一個項目,其中需要用到自動升級功能。因為自動升級是一個比較常用的功能,可能會在很多程式中用到,於是,我就想寫一個自動升級的組件,在應用程式中,只需要引用這個自動升級組件,並添加少量代碼,即可實現自動升級功能。因為我們的程式中可能包含多個類型的文件,比如exe、dll、 config、xm... ...
  • 本期同樣帶給大家分享的是阿笨在實際工作中遇到的真實業務場景,請跟隨阿笨的視角去如何實現採用微軟的ASP.NET OWIN技術承載WebAPI服務,如果您對本期的教程內容感興趣,那麼請允許讓阿笨帶著大家一起學習吧! 廢話不多說,直接上乾貨,我們不生產乾貨,我們只是乾貨的搬運工。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...