Java:註解Annotation(元數據)

来源:https://www.cnblogs.com/progor/archive/2018/07/28/9380445.html
-Advertisement-
Play Games

本文內容: 註解Annotation的介紹 基本註解的用法 首發日期:2018-07-28 註解Annotation的介紹 Annotation是代碼中的特殊標記,能夠在編譯、類載入、運行時被識別(需要設置),並根據不同的Annotation來執行不同的處理。 Annotation可以修飾包、類、構... ...



本文內容:

  • 註解Annotation的介紹
  • 基本註解的用法
  • 自定義註解

 

首發日期:2018-07-28


註解Annotation的介紹

  • Annotation是代碼中的特殊標記,能夠在編譯、類載入、運行時被識別(需要設置),並根據不同的Annotation來執行不同的處理。
  • Annotation可以修飾包、類、構造器、函數、成員變數、局部變數的聲明、參數等程式元素。Annotation幫助這些元素來設置元數據,程式從元數據中獲取信息來處理這些元素。

 

 

元數據可以描述代碼間關係或者代碼與其它資源的關係,比如說在web.xml中需要將請求路徑跟處理請求的servlet對應起來,比如說在Hibernate中需要.hbm文件來描述實體類與數據表之間的映射關係。元數據可以提供某些信息來協助我們程式的運行。

在Java中,Annotation就可以幫我們在代碼層面上去設置元數據,而不必需要去使用一些例如web.xml的文件來描述。

 


基本註解的用法

 

 

 

 

如何使用註解修飾元素:

  • 通常來說,在修飾目標的上一行進行註解,比如image。修飾成員變數也是如此。

 

常用的基本的Annotation:

@Override :指明下麵修飾的函數必須是重寫父類的函數的函數,如果修飾的函數不在父類中存在,那麼會報錯

@Deprecated :標明函數、類等元素已過時,效果是在使用已經過時的元素時會警告。

@SuppressWarnings:抑制修飾的元素髮生警告(warning),效果是修飾過後,編譯器不會提示警告。

@SafeVarargs【Java7新增】:如果把一個沒有定義泛型的集合,賦給一個有定義泛型的集合,會發生堆污染,會報錯。@SafeVarargs可以抑制這個報錯。

@FunctionalInterface【Java8新增】:用來限制修飾的介面必須是一個函數式介面,不然會報錯。

 

 

元Annotaion:修飾註解的註解

  • @Retention:指定Annotation的保留方式,保留方式不同,會影響能被使用的位置。比如如果需要通過反射獲取信息,那麼應該允許運行時還能獲取。
    • @Retention(RetentionPolicy.CLASS):預設值,代表把註解留在class文件中,程式運行後,JVM將無法獲取註解。【由於裡面的成員變數名為value,所以可以省去 參數名="xxx",如果不是value,那麼不可以省去!】
    • @Retention(RetentionPolicy.RUNTIME):代表把註解留在class文件中,程式運行後,JVM可以通過反射來獲取註解。
    • @Retention(RetentionPolicy.SOURCE):只留在源代碼中,JVM不會獲取到註解。
  • @Target:限制Annotaion能修飾哪些元素
    • @Target(ElemenetType.ANNOTATION_TYPE):指定被修飾的Annotaion只能用來修飾Annotaion
    • @Target(ElemenetType.FIELD):指定被修飾的Annotaion只能用來修飾成員變數
    • @Target(ElemenetType.CONSTRUCTOR):指定被修飾的Annotaion只能用來修飾構造器
    • @Target(ElemenetType.METHOD):指定被修飾的Annotaion只能用來修飾函數
    • @Target(ElemenetType.LOCAL_VARIABLE):指定被修飾的Annotaion只能用來修飾局部變數
    • @Target(ElemenetType.PACKAGE):指定被修飾的Annotaion只能用來修飾包
    • @Target(ElemenetType.PARAMETER):指定被修飾的Annotaion只能用來修飾參數
    • @Target(ElemenetType.TYPE):指定被修飾的Annotaion只能用來修飾類、介面(包括註解類型)或枚舉定義
  • @Documented:指定Annotaion是否能包含到javadoc生成的文檔中。
  • @Inherited:指定Annotaion具有繼承性,父類定義了這個註解,那麼子類也會繼承這個註解。

 

 

 


自定義註解

 

 

  • 自定義註解跟定義介面差不多,在interface的基礎上加一個@

image

  • 當就是這麼空,不寫東西的時候,是一個標記型的註解,標記型的註解功能比較簡單,通常只能用來標記特殊的元素從而進行處理。比如Override就是一個標記型的註解。

 

  • 註解可以定義成員變數,這些成員變數以聲明無形參函數的形式存在,返回值是變數的類型,函數名是變數的名字。註解上定義的成員變數只能是String、數組、Class、枚舉類、註解。成員變數可以提供更多的元數據信息。

image

定義了成員變數後,在使用的時候需要給成員變數賦值(成員變數名為value時,可以省去value="xxx",但是這個名字時,不可以省略)。在沒有成員變數時,可以單寫註解名,要賦值時就要用上括弧。

image

  • 如果某些成員變數不需要每次都賦值,可以給它設置預設值。成員變數可以有預設值,在變數的後面加上default 預設值.

image

 

 

 

註解處理器:

對於Java自帶的註解,Java有自己的註解處理器去處理。但自定義的註解,需要自己去定義註解處理器,自己去調用註解處理器去處理。所以,註解處理器本質上也是一個普通函數,不過它的工作主要是處理註解罷了。

在學會怎麼定義註解處理器之前先瞭解幾個前置知識:

  • 所有註解的父介面都是Annotation。
  • 一個註解,只有它的存在時間足夠我們才能使用它,所以如果我們想使用註解處理器,註解首先需要使用@Retention(RetentionPolicy.RUNTIME)修飾。
  • java.lang.reflect包中存在一些能夠實現反射功能的工具類。
  • java.lang.reflect包中有一個AnnotationElement介面,它聲明瞭一系列可以獲取註解的函數,並且它有幾個實現類,如下所見,所以你可以在類、構造函數等對象中調用聲明好的函數來獲取註解。image
    • getAnnotation(註解.class):獲取對應類型的註解
    • getAnnotations():獲取所有註解
    • getDeclaredAnnotations():獲取直接註解,忽略繼承過來的註解。
    • isAnnotationPresent(註解.class):判斷對應類型的註解是否存在

 

 

獲取註解:

image

image

....其他對象就演示了。

 

操作註解:通常來說,都是處理註解帶上的信息。

image

 

 

小例子

不知道你有沒有瞭解過org.junit.Test這個東西,這個可以讓你直接運行你想要運行的函數(可以稱為單元測試?)。而不需要你創建一個main()去調用。

下麵做一個示例,來實現類似的功能:

1.創建註解:

image

2.使用註解:

image

 

3.調用註解處理器:【這裡使用了org.junit.Test來調用,你也可以在main()中調用!】

image

 

結果是:

image

 

補充:

  • 上面的小例子中並沒有使用註解的成員變數,但事實上,使用成員變數也同樣只是獲取裡面的信息來做更多處理罷了,這就依靠個人去應用了。

 

 



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

-Advertisement-
Play Games
更多相關文章
  • /*$http常用的幾個參數 $http服務的設置對象: 1、method 字元串 表示發送的請求類型 get post jsonp等等 2、url 字元串 絕對或者相對的URL,請求的目標 3、params 字元串或對象 會被轉化成查詢字元串加到URL後面,如果不是字元串會被JSON序列化 4、d ...
  • RovingUI是個人在開發小程式過程中將用到的組件集合而成的一個UI庫,包含一些基本通用組件(按鈕、柵格、通用樣式、徽標、通知和麵包屑)。 源起得歸於我在開發中沒有找到現成的堆棧式提醒框(比如antd裡面的Notification),於是就自己寫了一個。發現效果還不錯,遂添了幾個通用組件,於是就有 ...
  • 在採用JQuery進行表單非同步提交時,前臺傳入的是json數據格式,後臺controller用map接收,再傳回前臺進行結果判斷時,if-else接收結果()裡面,儘量不要出現“=”,不然判斷語句失效,應該在後臺將一個boolean類型的flag變數存入map中:map.put("flag",tru ...
  • 匿名對象的概念: 匿名對象是指創建對象時,只有創建對象的語句,卻沒有把對象地址值賦值給某個變數。 格式: 創建一個普通對象 創建一個匿名對象 匿名對象的特點: l 創建匿名對象直接使用,沒有變數名。 l 匿名對象在沒有指定其引用變數時,只能使用一次。匿名對象不能被多次使用去調用方法 l 匿名對象可以 ...
  • 1.1 final的概念 final是個修飾符,它可以用來修飾類,類的成員,以及局部變數。不能修飾構造方法。 問題: 繼承的出現提高了代碼的復用性,並方便開發。但隨之也有問題,有些類在描述完之後,不想被繼承,或者有些類中的部分方法功能是固定的,不想讓子類重寫。可是當子類繼承了這些特殊類之後,就可以對 ...
  • static概念 static它是靜態修飾符,一般用來修飾類中的成員。 static特點 1.多個對象共用一個static成員變數。一個對象將static成員變數值修改了,其他對象中的static成員變數值也跟著改變 2.被static修飾的成員可以並且建議通過類名直接訪問。 訪問靜態成員的格式: ...
  • 在互聯網系統中,理想的情況下,肯定是希望系統能夠同時滿足“一致性”、“可用性”和“分區容忍性”。 但是基於熟悉的CAP定律也好,還是BASE理論, 我們知道,在實際情況中是不可能實現的。本文重點來闡述下關於一致性的方案,包括強一致性和最終一致性。 ...
  • 目錄: 一、while迴圈語句 二、for迴圈語句 三、range() 四、break語句 五、continue語句 六、課時09課後習題及答案 ********************* 一、while迴圈語句 ********************* Python的while迴圈跟if條件分支 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...