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
  • 移動開發(一):使用.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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...