Java進階——注解一文全懂

????????Java注解(Annotation)是一種強大的元數據機制,為代碼提供了附加信息,能簡化配置、增強代碼的可讀性和可維護性。本文將深入探討 Java 注解的相關知識。首先闡述了注解的基礎概念,包括其本質、作用以及核心分類(內置注解、元注解、自定義注解)。接著深入講解元注解,如@Target、@Retention、@Documented、@Inherited、@Repeatable等,解釋了它們的用途和使用方式。還介紹了自定義注解的定義語法、屬性類型限制及默認值設置,以及常見應用場景等。

本文目錄

    • 一、注解基礎概念
      • 1.1 本質與作用
      • 1.2 核心注解分類
    • 二、元注解詳解
      • 2.1 @Target
      • 2.2 @Retention
      • 2.3 @Documented
      • 2.4 @Inherited
      • 2.5 @Repeatable
    • 三、自定義注解
      • 3.1 定義語法
      • 3.2 屬性類型限制
      • 3.3 默認值
    • 四、注解處理方式
      • 4.1 編譯時處理
      • 4.2 運行時處理
    • 五、常見應用場景
      • 5.1 框架配置
      • 5.2 API文檔生成
      • 5.3 數據校驗
      • 5.4 AOP切面編程
      • 5.5 單元測試
    • 六、工作日常實戰應用
      • 6.1 接口權限控制注解
      • 6.2 基于角色的接口權限校驗
    • 七、注解使用重要注意點
      • 7.1 注解繼承問題
      • 7.2 默認值約束
      • 7.3 性能開銷
    • 八、總結

一、注解基礎概念

1.1 本質與作用

????????注解本質上是元數據,它為代碼提供了額外的信息,例如配置信息、標記信息或校驗規則等。重要的是,注解并不直接影響代碼的邏輯執行。在編譯期或運行時,Java可以通過反射機制讀取和處理這些注解,從而實現一些自動化的操作。

1.2 核心注解分類

  • 內置注解:Java提供了一些內置的注解,像@Override用于檢查方法是否正確重寫,@Deprecated用于標記某個方法或類已經廢棄,@SuppressWarnings則可以抑制編譯器產生的警告信息。
  • 元注解:元注解是用于定義其他注解的注解,常見的有@Target@Retention等。
  • 自定義注解:開發時可以根據具體的業務需求來定義自己的注解。


二、元注解詳解

2.1 @Target

@Target注解用于指定一個注解可以應用的目標范圍,它通過ElementType枚舉來指定。例如:

@Target({ElementType.METHOD, ElementType.TYPE})
public @interface CustomAnnotation {}

常見的目標類型包括TYPE(類或接口)、METHOD(方法)、FIELD(字段)、PARAMETER(參數)等。

2.2 @Retention

@Retention注解定義了注解的保留策略,通過RetentionPolicy枚舉來指定。有以下幾種策略:

  • SOURCE:注解僅在源碼級別存在,編譯后會被丟棄,例如@Override
  • CLASS:注解會保留到字節碼文件中,但在運行時不可見(默認策略)。
  • RUNTIME:注解在運行時可以通過反射機制讀取,例如Spring的@Autowired

2.3 @Documented

@Documented注解用于標記一個注解是否應該包含在Javadoc中。

2.4 @Inherited

@Inherited注解允許子類繼承父類的注解,但需要注意的是,它僅對類有效,對方法和字段無效。

2.5 @Repeatable

@Repeatable注解允許在同一位置重復使用同一個注解,不過需要配合一個容器注解一起使用。示例如下:

@Repeatable(Authorities.class)
public @interface Authority {String value();
}public @interface Authorities {Authority[] value();
}



三、自定義注解

3.1 定義語法

自定義注解使用@interface關鍵字來定義,例如:

public @interface Loggable {String module() default "log"; // 屬性可設默認值boolean enable() default true;
}

3.2 屬性類型限制

注解的屬性類型有一定的限制,僅支持基本類型、StringClass、枚舉、其他注解以及它們的數組。

3.3 默認值

可以通過default關鍵字為注解的屬性指定默認值。如果一個屬性沒有默認值,那么在使用該注解時必須為其賦值。


四、注解處理方式

4.1 編譯時處理

在編譯時,可以使用APT(Annotation Processing Tool)來處理注解并生成代碼。例如,Lombok的@Data注解就是通過APT來生成getter、setter等方法的。要實現編譯時注解處理,需要實現AbstractProcessor并注冊處理器。

4.2 運行時處理

在運行時,可以通過Java的反射API來讀取注解信息。示例代碼如下:

Method method = obj.getClass().getMethod("methodName");
if (method.isAnnotationPresent(Loggable.class)) {Loggable loggable = method.getAnnotation(Loggable.class);System.out.println(loggable.module());
}



五、常見應用場景

5.1 框架配置

在許多Java框架中,注解被廣泛用于配置。例如,Spring的@Component用于標記一個類為Spring的組件,@Autowired用于自動注入依賴;JPA的@Entity用于標記一個類為實體類。

5.2 API文檔生成

Swagger是一個常用的API文檔生成工具,它使用@ApiOperation@ApiParam等注解來描述API接口的信息,從而自動生成詳細的文檔。

5.3 數據校驗

Hibernate Validator提供了一系列的注解,如@NotNull@Size等,用于對數據進行校驗。例如:

public class UserRegisterRequest {@NotBlank(message = "用戶名不能為空")private String username;@Pattern(regexp = "^1[3-9]\\d{9}$", message = "手機號格式錯誤")private String phone;@Email(message = "郵箱格式錯誤")private String email;
}// 在Controller層自動校驗
@PostMapping("/register")
public ResponseEntity<?> registerUser(@Valid @RequestBody UserRegisterRequest request) {// 處理注冊邏輯
}

5.4 AOP切面編程

可以使用自定義注解來標記需要進行增強的方法,然后通過AOP來實現切面編程。例如:

@Around("@annotation(com.example.Loggable)")
public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {// 記錄方法日志return joinPoint.proceed();
}

5.5 單元測試

在單元測試中,JUnit使用@Test注解來標記一個測試方法,@BeforeEach注解用于在每個測試方法執行前執行一些初始化操作。


六、工作日常實戰應用

6.1 接口權限控制注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RequireRole {String[] value(); // 允許訪問的角色(如"ADMIN", "USER")
}

6.2 基于角色的接口權限校驗

@RestController
public class OrderController {@RequireRole({"ADMIN", "OPERATOR"}) // 僅允許管理員和運營@GetMapping("/orders")public List<Order> listAllOrders() {// 查詢所有訂單}// 權限校驗切面@Aspect@Componentpublic static class RoleCheckAspect {@Around("@annotation(requireRole)")public Object checkRole(ProceedingJoinPoint joinPoint, RequireRole requireRole) throws Throwable {HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();String userRole = (String) request.getAttribute("currentUserRole");if (!Arrays.asList(requireRole.value()).contains(userRole)) {throw new AccessDeniedException("Permission denied");}return joinPoint.proceed();}}
}



七、注解使用重要注意點

7.1 注解繼承問題

默認情況下,子類不會繼承父類方法上的注解。如果需要繼承,需要使用@Inherited注解,并且父類注解的@Retention策略必須為RUNTIME

7.2 默認值約束

注解的屬性不能為null,需要使用默認值或空字符串、空數組等來替代。

7.3 性能開銷

頻繁使用反射來讀取運行時注解可能會影響性能,可以通過緩存來優化,例如:

private static final Map<Method, RequireRole> roleCache = new ConcurrentHashMap<>();public static RequireRole getRequireRole(Method method) {return roleCache.computeIfAbsent(method, m -> m.getAnnotation(RequireRole.class));
}



八、總結

????????Java注解是一種強大而靈活的機制,它可以顯著提升代碼的可維護性和開發效率。通過深入理解注解的基礎概念、元注解、自定義注解、處理方式以及應用場景,可以在實際項目中合理地運用注解幫助我們實現權限控制、日志記錄、數據校驗等功能。



← 上一篇 Java進階——Stream流以及常用方法詳解
記得點贊、關注、收藏哦!
下一篇 Java進階——數據類型深入解析 →

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/896543.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/896543.shtml
英文地址,請注明出處:http://en.pswp.cn/news/896543.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

DeepSeek 15天指導手冊——從入門到精通 PDF(附下載)

DeepSeek使用教程系列--DeepSeek 15天指導手冊——從入門到精通pdf下載&#xff1a; https://pan.baidu.com/s/1PrIo0Xo0h5s6Plcc_smS8w?pwd1234 提取碼: 1234 或 https://pan.quark.cn/s/2e8de75027d3 《DeepSeek 15天指導手冊——從入門到精通》以系統化學習路徑為核心&…

【智能音頻新風尚】智能音頻眼鏡+FPC,打造極致聽覺享受!【新立電子】

智能音頻眼鏡&#xff0c;作為一款將時尚元素與前沿科技精妙融合的智能設備&#xff0c;這種將音頻技術與眼鏡形態完美結合的可穿戴設備&#xff0c;不僅解放了用戶的雙手&#xff0c;更為人們提供了一種全新的音頻交互體驗。新立電子FPC在智能音頻眼鏡中的應用&#xff0c;為音…

常用的 pip 命令

pip 是 Python 的包管理工具&#xff0c;可用于安裝、卸載、更新和管理 Python 包。以下是一些常用的 pip 命令&#xff1a; 1. 安裝包 安裝最新版本的包 pip install package_namepackage_name 是你要安裝的 Python 包的名稱&#xff0c;例如 pip install requests 可以安裝…

學習threejs,使用ShaderMaterial自定義著色器材質

&#x1f468;??? 主頁&#xff1a; gis分享者 &#x1f468;??? 感謝各位大佬 點贊&#x1f44d; 收藏? 留言&#x1f4dd; 加關注?! &#x1f468;??? 收錄于專欄&#xff1a;threejs gis工程師 文章目錄 一、&#x1f340;前言1.1 ??THREE.ShaderMaterial1.1.1…

從暴力破解到時空最優:LeetCode算法設計核心思維解密

一、算法優化金字塔模型&#xff08;時間復雜度/空間復雜度協同優化&#xff09; 1.1 復雜度分析的本質 大O記號的三層認知&#xff1a; ① 理論復雜度邊界&#xff08;理想模型&#xff09; ② 硬件架構影響&#xff08;緩存命中率/分支預測&#xff09; ③ 語言特性損耗&am…

Typora的Github主題美化

[!note] Typora的Github主題進行一些自己喜歡的修改&#xff0c;主要包括&#xff1a;字體、代碼塊、表格樣式 美化前&#xff1a; 美化后&#xff1a; 一、字體更換 之前便看上了「中文網字計劃」的「朱雀仿宋」字體&#xff0c;于是一直想更換字體&#xff0c;奈何自己拖延癥…

用大白話解釋搜索引擎Elasticsearch是什么,有什么用,怎么用

Elasticsearch是什么&#xff1f; Elasticsearch&#xff08;簡稱ES&#xff09;就像一個“超級智能的圖書館管理系統”&#xff0c;專門幫你從海量數據中快速找到想要的信息。它底層基于倒排索引技術&#xff08;類似書籍的目錄頁&#xff09;&#xff0c;能秒級搜索和分析萬…

神經網絡 - 激活函數(Sigmoid 型函數)

激活函數在神經元中非常重要的。為了增強網絡的表示能力和學習能力&#xff0c;激活函數需要具備以下幾點性質: (1) 連續并可導(允許少數點上不可導)的非線性函數。可導的激活函數可以直接利用數值優化的方法來學習網絡參數. (2) 激活函數及其導函數要盡可能的簡單&#xff0…

Spring 源碼硬核解析系列專題(六):Spring MVC 的請求處理源碼解析

在前幾期中,我們探討了 Spring 的 IoC 容器、Bean 創建、AOP、事務管理以及 Spring Boot 的自動裝配,這些為 Spring MVC 的運行奠定了基礎。作為 Spring 生態中處理 Web 請求的核心模塊,Spring MVC 通過 DispatcherServlet 實現了靈活的請求分發與處理。本篇將深入 Dispatch…

Docker容器日常維護常用命令大全

友情提示&#xff1a;本文內容由銀河易創&#xff08;https://ai.eaigx.com&#xff09;AI創作平臺deepseek-v3模型生成&#xff0c;文中所有命令未進行驗證&#xff0c;僅供參考。請根據具體情況和需求進行適當的調整和驗證。 引言 Docker作為當前最流行的容器化技術&#xf…

Pytest測試用例執行跳過的3種方式

文章目錄 1.前言2.使用 pytest.mark.skip 標記無條件跳過3.使用 pytest.mark.skipif 標記根據條件跳過4. 執行pytest.skip()方法跳過測試用例 1.前言 在實際場景中&#xff0c;我們可能某條測試用例沒寫完&#xff0c;代碼執行時會報錯&#xff0c;或者是在一些條件下不讓某些…

GitHub 語析 - 基于大模型的知識庫與知識圖譜問答平臺

語析 - 基于大模型的知識庫與知識圖譜問答平臺 GitHub 地址&#xff1a;https://github.com/xerrors/Yuxi-Know &#x1f4dd; 項目概述 語析是一個強大的問答平臺&#xff0c;結合了大模型 RAG 知識庫與知識圖譜技術&#xff0c;基于 Llamaindex VueJS FastAPI Neo4j 構…

vue學習七

十四 pinia 官網&#xff1a;安裝 | Pinia 中文文檔 集中式狀態管理&#xff0c;與vuex相似&#xff0c;提供變量存儲便于數據共享。 從概念上類似于php中的session吧…… 適用于少量數據的共享&#xff0c;可操作數據都是先定義后使用。 適用于判斷用戶是否登錄&#xff…

【Prometheus】prometheus服務發現與relabel原理解析與應用實戰

?? 歡迎大家來到景天科技苑?? ???? 養成好習慣,先贊后看哦~???? ?? 作者簡介:景天科技苑 ??《頭銜》:大廠架構師,華為云開發者社區專家博主,阿里云開發者社區專家博主,CSDN全棧領域優質創作者,掘金優秀博主,51CTO博客專家等。 ??《博客》:Python全…

【折線圖 Line】——1

?? 解鎖數據可視化的魔法鑰匙 —— pyecharts實戰指南 ?? 在這個數據為王的時代,每一次點擊、每一次交易、每一份報告背后都隱藏著無盡的故事與洞察。但你是否曾苦惱于如何將這些冰冷的數據轉化為直觀、吸引人的視覺盛宴? ?? 歡迎來到《pyecharts圖形繪制大師班》 ?…

004-利用Docker安裝Mysql

利用Docker安裝Mysql 一、在鏡像倉庫找到 Mysql1.鏡像倉庫地址2.復制命令3.下載Mysql鏡像4.查看鏡像 二、創建實例并啟動三、用本地工具連接數據庫四、設置 Mysql 配置 一、在鏡像倉庫找到 Mysql 1.鏡像倉庫地址 https://hub.docker.com 2.復制命令 docker pull mysql:8.0…

當JMeter遇見AI:性能測試進入智能時代(附實戰案例)

性能測試作為軟件開發中的關鍵環節&#xff0c;確保系統在高負載下仍能高效運行。JMeter 是一種廣泛使用的開源工具&#xff0c;用于負載測試和性能測量&#xff0c;但傳統方法往往效率低下。AI 的引入&#xff0c;為性能測試帶來了智能化升級。本文將探討 JMeter 與 AI 的結合…

DeepSeek R1 + 飛書機器人實現AI智能助手

效果 TFChat項目地址 https://github.com/fish2018/TFChat 騰訊大模型知識引擎用的是DeepSeek R1&#xff0c;項目為sanic和redis實現&#xff0c;利用httpx異步處理流式響應&#xff0c;同時使用buffer來避免頻繁調用飛書接口更新卡片的網絡耗時。為了進一步減少網絡IO消耗&…

多樣化的化學結構式表示法

化學結構式是用元素符號和短線表示化合物&#xff08;或單質&#xff09;分子中原子的排列和結合方式的式子&#xff0c;它具有多方面的重要含義&#xff0c;具體如下&#xff1a; 表示原子組成及種類體現原子的連接順序和方式反映分子的空間構型揭示化學性質和反應機理用于化…

Vmvare虛擬機使用代理

1. 宿主機配置 宿主機配置好網絡&#xff0c;能訪問google&#xff0c;然后開啟局域網代理 記錄下宿主機的真實網卡的ip地址及代理服務的端口號 例如 192.168.101.120:52209 2. 虛擬機配置 vmvare網絡連接設置 虛擬機網絡連接選擇nat模式 終端環境變量設置 終端只需設置以下…