Java開發筆記(八十二)註解的基本單元——元註解

来源:https://www.cnblogs.com/pinlantu/archive/2019/04/08/10673520.html
-Advertisement-
Play Games

Java的註解非但是一種標記,還是一種特殊的類型,並且擁有專門的類型定義。前面介紹的五種內置註解,都可以找到對應的類型定義代碼,例如查看註解@Override的源碼,發現它的代碼定義是下麵這樣的: 又如註解@FunctionalInterface,它的源碼定義與之類似: 乍看過去,註解的定義竟與介面 ...


Java的註解非但是一種標記,還是一種特殊的類型,並且擁有專門的類型定義。前面介紹的五種內置註解,都可以找到對應的類型定義代碼,例如查看註解@Override的源碼,發現它的代碼定義是下麵這樣的:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {}

 

又如註解@FunctionalInterface,它的源碼定義與之類似:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface FunctionalInterface {}

 

乍看過去,註解的定義竟與介面有幾分相像,介面的類型名稱是“interface”,而註解的類型名稱是“@interface”,僅僅多了一個@符號。此外,內置註解的定義代碼上方多出了好幾個其它註解,包括@Target、@Retention、@Documented等等,這三個註解連同@Inherited組成了Java的“元註解”。四個元註解的作用是給新定義的註解添加修飾,標明新註解什麼能幹什麼不能幹,好比給一個戰士配備各式各樣的武器,使得他更適合在某種環境之中作戰。接下來就對四種元註解分別進行詳細介紹:

1、@Documented
該註解表示它修飾的註解將被收錄到Java的開發文檔中,這意味著程式員編碼時的快捷提示會出現已收入的註解。
所謂的快捷提示,指的是每當程式員輸入少數幾個字元並按下“Alt+/”時,eclipse就自動彈出以這幾個字元開頭的辭彙列表,以便程式員迅速選擇想要的辭彙,從而加快編碼速度。比如,程式員在某個空行輸入字母M,然後按下組合鍵“Alt+/”,eclipse會彈出以M打頭的辭彙列表,包括數學函數庫Math、映射Map、方法Method等等,此時點擊“Method”這行提示,eclipse便自動把M補齊成為Method。
添加了@Documented的註解如@FunctionalInterface,就會出現在這種提示列表;而@Override沒被@Documented所修飾,就不會在提示列表中出現。故而程式員在一個空行輸入符號@,然後按下組合鍵“Alt+/”,彈出的辭彙列表中能找到“@FunctionalInterface”,卻不能找到“@Override”了。

2、@Target
該註解表示它修飾的註解將作用於哪一類的代碼實體,例如ElementType.METHOD規定@Override對方法有效,而ElementType.TYPE規定@FunctionalInterface對類型有效。更多的ElementType取值說明見下:
TYPE:類型,包括類、介面和枚舉。
FIELD:欄位,即類的屬性。
METHOD:方法,但不包含構造方法。
PARAMETER:方法的參數。
CONSTRUCTOR:構造方法。
LOCAL_VARIABLE:局部變數。
ANNOTATION_TYPE:註解類型。
PACKAGE:包。

3、@Retention
該註解表示它修飾的註解將被編譯器保留至哪個階段,例如“@Retention(RetentionPolicy.SOURCE)”規定編譯器只在編碼階段保留@Override,而“@Retention(RetentionPolicy.RUNTIME)”規定編譯器直到運行階段仍然保留@FunctionalInterface。更多的RetentionPolicy取值說明見下:
SOURCE:只在編碼階段保留。
CLASS:保留在編譯生成的class文件中,但不在運行時保留。這樣從class文件反編譯出來的源碼仍可找到它所修飾的註解。
RUNTIME:一直保留至運行階段。這樣修飾後的註解可通過反射技術讀取獲得,以便代碼在運行時動態校驗註解。

4、@Inherited
該註解表示它修飾的註解將允許被子類所繼承。
通常情況下,一個註解加在某個類上面的話,它只對當前類有效,而對當前類的子類無效。倘若程式員希望該註解同時作用於當前類及其所有子類,則需要給這個註解的定義代碼添加@Inherited修飾,表示該註解的作用範圍擴展到當前類派生出來的子類。



更多Java技術文章參見《Java開發筆記(序)章節目錄


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

-Advertisement-
Play Games
更多相關文章
  • 1. 調用鏈Cat 1.1. 調用鏈演進 1.2. 開源產品比較 1.3. 監控場景 1.4. cat的增值作用 1.5. cat典型報表 1.5.1. 應用報錯大盤 1.5.2. 業務大盤 1.5.3. logView 1.5.4. 可視化的logView 1.5.5. 應用報表(APM) 1.5 ...
  • 一、請求鉤子 在客戶端和伺服器交互的過程中,有些準備工作或稍微工作是需要處理的,比如:在請求開始時,建立資料庫連接;在請求開始時,根據需求進行許可權校驗;在請求結束時,指定數據的交互格式等。為了讓每個視圖函數避免編寫重覆功能的代碼,flask提供了通用設施的功能,即請求鉤子。 例子: 運行結果: 第1 ...
  • 概念 公平鎖/非公平鎖 公平鎖是指多個線程按照申請鎖的順序來獲取鎖。 非公平鎖是指多個線程獲取鎖的順序並不是按照申請鎖的順序,有可能後申請的線程比先申請的線程優先獲取鎖。有可能,會造成優先順序反轉或者饑餓現象。 對於 Java ReentrantLock而言,通過構造函數指定該鎖是否是公平鎖,預設是非 ...
  • "概要" "schema" "changeset" "struct" "map" "總結" 概要 Ecto 中, 對資料庫的操作中經常用到 4 個類型: schema changeset struct map 在 Ecto 的 API 中, 基本都是都是對這 4 個類型的操作, 這 4 個類型的關係 ...
  • (1) np.mashgrid()函數: 生成網路點坐標矩陣,可以是二維網路矩陣,也可以是三維網路矩陣。其中,每個交叉點就是網路點,描述這些網路點的矩陣就是坐標矩陣(橫坐標矩陣X中的每個元素與縱坐標矩陣Y中對應位置元素,共同構成一個點的完整坐標)。 背景示例:網路點與坐標矩陣的解釋如下: impor ...
  • 之前在CSDN上也寫了幾篇技術的博客,大部分在Onenote裡面記錄學習過程,在寫筆記中也大量參閱CNblog和CSDN, 突然發現CNblog的界面清晰簡潔,因此發佈在網上也可以幫助到更多的人解決學習過程中類似的問題。 ...
  • 多線程 什麼是鎖? - 鎖通常被用來實現對共用資源的同步訪問。 - 為每一個共用資源創建一個Lock對象,當你需要訪問該資源時,調用acquire方法來獲取鎖對象(如果其它線程已經獲得了該鎖,則當前線程需等待其被釋放),待資源訪問完後,再調用release方法釋放鎖: GIL(Global Inte ...
  • 註:請在linux系統下測試本文中出現的代碼。以下是一些優秀程式員的回答,特此譯註。 Andrew Weimholt 的回覆: switch語句中的case 關鍵詞可以放在if-else或者是迴圈當中 Brian Bi 的回覆: 1. 聲明緊隨用途之後 理解聲明有一條很簡單的法則,不過不是什麼“從左 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...