JAVA-註解(2)-自定義註解及反射註解

来源:https://www.cnblogs.com/xiaoluohao/archive/2019/07/26/11253307.html
-Advertisement-
Play Games

自定義註解開發 1.開發一個註解類 開發一個註解類的過程,非常類似於開發一個介面,只不過需要通過@interface關鍵字來聲明 2.使用元註解修飾註解的聲明 所謂的原註解是用來修飾註解聲明的註釋,可以控制被修飾的註解的特性。 @Target 用來聲明被修飾的註解可以用在什麼位置。 可以在@Targ ...


自定義註解開發

  1.開發一個註解類

    開發一個註解類的過程,非常類似於開發一個介面,只不過需要通過@interface關鍵字來聲明

  2.使用元註解修飾註解的聲明

    所謂的原註解是用來修飾註解聲明的註釋,可以控制被修飾的註解的特性。

    @Target

      用來聲明被修飾的註解可以用在什麼位置。

      可以在@Target的屬性中設置Element Type類型的數組來指定可以使用的位置。

      如果不使用此原註解修飾,預設註解可以用在任意位置。

    @Retention

      用來聲明被修飾的註釋會被保留到什麼階段。

      可以在該註解的屬性中通過RetentionPolicy類型的值來指定註釋被保留到何時。

        (1)RetentionPolicy.SOURCE

            此註解將會被保留到源碼階段,java中,在編譯過程中被刪除。

            這種類型的註解通常是給編譯器看的。

        (2)Retention Policy.CLASS

            此註解將會被保留到源碼階段和編譯階段,.java和.class中,在類載入的過程中被刪除。

            這種類型的註解通常是給類載入器看的。

        (3)RetentionPolicy.RUNTIME

            此註解將會被保留在源碼階段、編譯階段和運行階段,.java  .class和記憶體中的位元組碼中都會存在。

            這種類型的註解通常在運行階段進行反射,控製程序運行過程。

         ***只有RUNTIME級別的註解才可以通過反射技術進行反射。

    @Documented

        用來聲明被修飾註解是否要被文檔提取工具提取到文檔中。

        預設不提取

    @Inherited

        被修飾的註釋是否具有繼承性

        預設沒有繼承性

  3.為註解增加屬性

    註解類中還可以有聲明屬性。

    為註解類聲明屬性的過程非常類似於介面定義方法。

    但要求,註解中的所有的屬性必須是public的,可以顯式聲明,也可以不聲明,不聲明預設就是public的。

    註解中的屬性只能是八種基本數據類型、String類型、Class類型、其他註解類型及以上類型的一維數組。

    註解中聲明的屬性 需要在使用註解時,為其賦值,賦值的方式就是在使用註解時,在註解後跟上一對小括弧,在括弧中通過  屬性名=屬性值   的方式指定屬性的值

    也可以在聲明註解時,在註解的屬性後面通過default關鍵字,聲明屬性的預設值,這樣一來,使用註解時不賦值,將會使用default預設值,當然也可以手動賦值,覆蓋預設值。

    如果屬性是一維數組類型,在傳入的數組中,只有一個值,則包括數組的大括弧也可以省略。

    如果註解的屬性只有一個需要賦值,且該屬性的名稱叫做value,則在使用註解時,value==可以不寫

反射註解

  1.反射註解的原理

    RetentionPolicy.RUNTIME級別的註解會保留到運行中,可以通過反射技術獲取,從而可以根據是否有註解 或 註解屬性值的不同來控製程序按照不同方式運行。

    以下反射相關的類型中都提供了反射註解的方法:

      類Class<T>、類Method、類FIeld、類Constructor<T>、類Package

    

  2.反射註解案例

 1 package cn.tedu.test;
 2 
 3 import java.lang.annotation.ElementType;
 4 import java.lang.annotation.Retention;
 5 import java.lang.annotation.RetentionPolicy;
 6 import java.lang.annotation.Target;
 7 
 8 @Target(ElementType.TYPE)
 9 @Retention(RetentionPolicy.RUNTIME)
10 @interface level{
11     String value();
12 }
13 
14 @level("刑警")
15 class Police{
16 }
17 
18 public class AnnoTest02 {
19     public static void main(String[] args) {
20         System.out.println("敬了個禮,您好,您超速了,罰款200元。。。");
21         if(Police.class.isAnnotationPresent(level.class)){
22             level anno = Police.class.getAnnotation(level.class);
23             if("協警".equals(anno.value())){
24                 System.out.println("哥們少罰點,50塊得了~~");
25             }else if("交警".equals(anno.value())){
26                 System.out.println("哥們抽根煙,這是200塊,收好我走人~~");
27             }else if("刑警".equals(anno.value())){
28                 System.out.println("趕緊交錢走人,別查出 別的事。。。");
29             }else{
30                 System.out.println("xxx");
31             }
32         }else{
33             System.out.println("打一頓,扭送警察局。。");
34         }
35     }
36 }

 


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

-Advertisement-
Play Games
更多相關文章
  • 一、持久化 --shelve 持久化工具 (1)作用:類似字典,用kv對保存數據,存取方式類似於字典 (2)例子:通過一下案例創建了一個資料庫,第二個程式我們讀取了資料庫 2.shelve特性 (1)註意:不支持多個應用並行寫入,為瞭解決這個問題,open的時候可以使用writeback=True, ...
  • 今天比較晚,所以只看了shiro的認證策略Authentication Strategy,下麵講講shiro的三種認證策略。 1.AtLeastOneSuccessfulStrategy:這個是shiro預設的認證策略,它表示如果存在多個realm來執行認證,只要其中有一個成功,那麼認證就成功(這裡 ...
  • 先說顏色: 綠色:public 黃色:protected 藍色:no modifier 紅色:private 再說形狀: 實心:method 空心:variable 實心中間有字母C:class Class右側有向右的箭頭:運行入口 再說字母: S:static F:final 常用組合: 綠圓圈: ...
  • 基本思想 通過Dlib獲得當前人臉的特征點,然後通過旋轉平移標準模型的特征點進行擬合,計算標準模型求得的特征點與Dlib獲得的特征點之間的差,使用Ceres不斷迭代優化,最終得到最佳的旋轉和平移參數。 使用環境 系統環境:Ubuntu 18.04 使用語言:C++ 編譯工具:CMake 第三方工具 ...
  • 第一次打開PyCharm可能需要修改一些個性化和瞭解一些基本操作,有助於接下來的學習過程.(後續可能會更新) 我的版本是64位的1.3 1.換界麵皮膚 預設黑色的,不喜歡黑色皮膚可以換成白色的 File Settings Appearance&Behavior Appearance Theme 2. ...
  • 肯定有這樣的一種場景,寫一個函數,該函數可以接收任意類型的切片,完成相應的功能。 就好比這種情況 還有很多類型的切片,但是我對這些切片的使用,只是for迴圈每一個元素,執行Print操作就可以了。 那就定義一個函數,函數的接收參數就是這個切片就行了,但是切片類型太多了,你要根據不同的切片類型,寫不同 ...
  • 什麼是埃及乘法 埃及乘法的思路是:反覆地將n減半,並將a加倍,同時求出a的各種倍數,這些倍數與a的比值都是2的整數次冪。n的值為奇數部分的a之和即為所求值 舉個慄子:41 x 59 1 41 59 √ 2 20 118 4 10 236 8 5 472 √ 16 2 944 32 1 1888 √ ...
  • 運行結果: 發現乘法表有錯位,在程式中加入製表符,就解決了 程式如下: 運行結果: ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...