Java基礎知識總結(1.8)——Java 注解(持續更新)

更新時間:2025-03-31

  • Web后端專欄:CSDN專欄——理論-Web后端
  • 技術博客總目錄:計算機技術系列博客——目錄頁

8.1 注解的概念

8.1.1 定義與作用

Java注解(Annotation)是Java語言自JDK1.5版本引入的核心特性,其本質是為代碼添加元數據的一個標記,通過@AnnotationName語法將元數據(Metadata)附加到代碼元素(類、方法、字段等)上,用于描述或配置程序行為。

  • 元數據特性:注解本身不直接影響業務邏輯,而是提供補充信息供編譯器、框架或運行時環境使用。
  • 非侵入式配置能力:注解通過元數據與代碼解耦的特性,極大提升了代碼可讀性和框架擴展性,既支持編譯器靜態檢查,也賦能框架動態行為控制。

8.1.2 典型應用場景

  1. 文檔生成:如@author@param等注解配合Javadoc工具生成API文檔。
  2. 框架集成:如Spring等框架通過@Controller@Service等注解實現依賴注入和配置簡化。
  3. 數據校驗:如JSR 303規范的@NotNull@Size等注解實現參數合法性校驗。
  4. 代碼生成:如Android的ButterKnife通過@BindView生成視圖綁定代碼。
  5. 信息標記:為代碼添加說明性標簽,如標記方法重寫(@Override)或廢棄方法(@Deprecated)。
  6. 運行時處理:通過反射(Reflection)讀取注解信息,動態控制程序行為(如權限校驗)。

8.2 注解的類型

8.2.1 按生命周期分類

  1. SOURCE(源碼級)
    僅存在于源碼中,編譯后丟棄。常用于標記代碼規范或生成輔助信息。
    示例@Override(檢查方法重寫)、@SuppressWarnings(抑制編譯器警告)、Lombok的@Getter(觸發編譯時代碼生成)。

  2. CLASS(字節碼級)
    注解信息保留至.class文件,但運行時不可見。適用于編譯后處理的工具(如AOP字節碼增強)。
    示例:AOP框架(如AspectJ)在類加載時修改字節碼實現切面邏輯。

  3. RUNTIME(運行時級)
    注解信息在運行時可通過反射讀取,是實現框架動態邏輯的核心。
    示例:Spring的@Autowired(依賴注入)、JUnit的@Test(測試方法標識)。

8.2.2 按功能用途分類

  1. 元注解(Meta-Annotation)
    用于定義其他注解的注解,包含以下核心類型:

    • @Target:限定注解可標注的目標(例如 ElementType.METHOD 表示僅用于方法)。
    • @Retention:指定注解生命周期(例如 RetentionPolicy.RUNTIME )。
    • @Inherited:允許子類繼承父類注解。
    • @Documented:將注解包含在Javadoc中。
  2. 內置注解(Built-in Annotations)
    Java語言原生提供,主要用于編譯檢查或代碼標記:

    • 編譯校驗:例如 @Override(驗證方法重寫)、@FunctionalInterface(標記函數式接口)。
    • 代碼標記:例如 @Deprecated(標識廢棄方法)、@SuppressWarnings(忽略特定警告)。
  3. 自定義注解(Custom Annotations)
    開發者根據需求定義的注解,需結合元注解配置作用范圍。

    示例

    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)
    public @interface LogExecution { // 記錄方法執行日志String level() default "INFO";
    }
    

8.2.3 按來源定義分類

  1. 框架注解
    主流框架定義的注解,用于簡化配置和擴展功能。例如:

    • Spring@Controller(標記控制器)、@RequestMapping(定義HTTP接口路徑)。
    • JPA@Entity(標識實體類)、@Column(映射數據庫字段)。
  2. 標準庫注解
    Java標準庫中定義的通用注解。例如 @SafeVarargs(抑制泛型可變參數警告)。

8.2.4 按處理階段分類

  1. 編譯時處理注解
    通過APT(Annotation Processing Tool)在編譯時生成代碼或檢查錯誤。
    示例:Android的@BindView(生成視圖綁定代碼)、Lombok的@Data(自動生成Getter/Setter)。

  2. 運行時處理注解
    依賴反射機制在運行時動態解析,實現業務邏輯。
    示例:Spring的@Transactional(事務管理)、Hibernate的@Valid(參數校驗)。

8.2.5 按作用域分類

  1. 類級別作用域
    用于描述的注解,通常放置在類定義的上面,可以用來指定類的一些屬性,如類的訪問級別、繼承關系、注釋等。

  2. 方法級別作用域
    用于描述方法的注解,通常放置在方法定義的上面,可以用來指定方法的一些屬性,如方法的訪問級別、返回值類型、異常類型、注釋等。

  3. 字段級別作用域
    用于描述字段的注解,通常放置在字段定義的上面,可以用來指定字段的一些屬性,如字段的訪問級別、默認值、注釋等。

  4. 其他作用域
    除了這三種作用域,Java還提供了其他一些注解作用域,例如構造函數作用域和局部變量作用域。這些注解作用域可以用來對構造函數和局部變量進行描述和注釋。


8.3 注解的運行機制

8.3.1 元數據定義規范

  1. 元數據本質
    注解通過@interface關鍵字定義,本質上是一種繼承java.lang.annotation.Annotation接口的特殊類型,所以注解也叫聲明式接口。

    • 元注解控制:通過@Target@Retention等元注解限定作用目標(如方法、字段)和生命周期(SOURCE/CLASS/RUNTIME)。
    • 元素定義:注解內部可聲明方法(如String value()),作為可配置參數。
  2. 字節碼存儲
    當注解被標記為 RUNTIME 時,Java 編譯器會在生成的 .class 文件中保存注解信息。這些信息存儲在字節碼的屬性表(Attribute Table)中,具體包括以下內容:

    • RuntimeVisibleAnnotations :存儲運行時可見的注解信息。
    • RuntimeInvisibleAnnotations :存儲運行時不可見的注解信息。
    • RuntimeVisibleParameterAnnotationsRuntimeInvisibleParameterAnnotations :存儲方法參數上的注解信息。

8.3.2 運行時解析機制

  1. 反射獲取信息
    Java提供AnnotatedElement接口(Class、Method等類實現)支持運行時獲取注解:

    Method method = obj.getClass().getMethod("test");
    Annotation[] annotations = method.getAnnotations(); // 獲取所有注解
    
    • 底層原理:反射機制的核心類是 java.lang.reflect.AnnotatedElement,它是所有可以被注解修飾的元素(如 ClassMethodField 等)的父接口。該接口提供了以下方法:
      • getAnnotation(Class<T> annotationClass):獲取指定類型的注解。
      • getAnnotations():獲取所有注解。
      • isAnnotationPresent(Class<? extends Annotation> annotationClass):判斷是否包含指定注解。
    • 后端依賴: JVM 提供的本地方法(Native Method),JVM 在加載類時會解析 .class 文件中的注解信息,并將其存儲在內存中,供反射機制使用。
    • 性能問題:頻繁反射調用可能影響性能,框架常采用緩存或預解析優化(如Spring啟動時掃描注解)。
  2. 動態代理與容器管理
    框架結合注解與代理模式實現功能擴展:

    • 事務管理:Spring對@Transactional標注的方法生成代理,在調用前后管理事務。
    • 權限校驗:自定義@RequireRole注解結合攔截器實現權限控制。

8.3.3 編譯時處理機制

  • APT(Annotation Processing Tool)
    編譯器調用注解處理器(繼承AbstractProcessor)生成代碼或報告錯誤:
    • 代碼生成:如Android的ButterKnife通過@BindView生成視圖綁定代碼、Lombok通過@Data修改AST(抽象語法樹)在編譯階段生成Getter/SettertoString()方法。
    • 元編程:如MapStruct根據@Mapper注解自動生成對象轉換實現類。

8.3.4 框架集成范式

  1. 配置驅動模式
    注解替代XML成為主流配置方式,實現高內聚低耦合:

    • Spring Boot@SpringBootApplication整合組件掃描、自動配置等能力。
    • JPA/Hibernate@Entity定義實體類與數據庫表的映射關系。
  2. 聲明式編程
    通過注解聲明意圖而非編寫具體邏輯:

    • 聲明式事務@Transactional替代手動提交/回滾代碼。
    • 聲明式緩存@Cacheable自動管理方法返回值緩存。

本文由 CSDN 用戶 Allen Wurlitzer 原創,遵循CC-BY-SA協議發布,轉載請注明出處。

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

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

相關文章

線程概念與控制(下)

線程概念與控制&#xff08;中&#xff09;https://blog.csdn.net/Small_entreprene/article/details/146539064?sharetypeblogdetail&sharerId146539064&sharereferPC&sharesourceSmall_entreprene&sharefrommp_from_link對于之前學習的內容&#xff0c;我們…

SQL注入之盲注技術詳解

SQL注入之盲注技術詳解 一、盲注基本概念盲注特點&#xff1a; 二、盲注主要類型1. 布爾盲注判斷依據&#xff1a; 2. 時間盲注判斷依據&#xff1a; 三、布爾盲注詳細技術1. 識別布爾盲注2. 數據提取技術(1) 判斷數據庫類型(2) 獲取數據庫名長度(3) 逐字符獲取數據庫名(4) 獲取…

OpenCV 圖形API(3)高層次設計概覽

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 描述 G-API 是一個異構框架&#xff0c;提供了統一的 API 來使用多個支持的后端編程圖像處理流水線。 關鍵的設計理念是在指定使用哪些內核和設備時保持流…

阿里云Tair KVCache:打造以緩存為中心的大模型Token超級工廠

一、Tair KVCache 簡介 Tair KVCache 是阿里云瑤池旗下云數據庫 Tair 面向大語言模型推理場景推出的 KVCache 緩存加速服務。 隨著互聯網技術的演進與流量規模的激增&#xff0c;緩存技術逐漸成為系統架構的核心組件。該階段催生了 Redis 等開源緩存數據庫&#xff0c;阿里巴巴…

Open GL ES ->GLSurfaceView正交投影與透視投影方法中近遠平面取值參考

坐標系 OpenGL ES使用右手坐標系&#xff0c;相機默認朝向負z方向 相機位置|vz軸<----- 0 -----> -near -----> -far -----不可見 可見區域 不可見裁剪規則 只有z值在[-near, -far]范圍內的物體可見&#xff0c; 當z > -near&#xff08;在近平面前&#…

iOS自定義collection view的page size(width/height)分頁效果

前言 想必大家工作中或多或少會遇到下圖樣式的UI需求吧 像這種cell長度不固定&#xff0c;并且還能實現的分頁效果UI還是很常見的 實現 我們這里實現主要采用collection view&#xff0c;實現的方式是自定義一個UICollectionViewFlowLayout的子類&#xff0c;在這個類里對…

Java高頻面試之并發編程-01

hello啊&#xff0c;各位觀眾姥爺們&#xff01;&#xff01;&#xff01;本baby今天來報道了&#xff01;哈哈哈哈哈嗝&#x1f436; 面試官&#xff1a;并行跟并發有什么區別&#xff1f; 并發 vs 并行&#xff1a;核心區別與場景 1. 定義對比 維度并發&#xff08;Concu…

從零開始學Rust:所有權(Ownership)機制精要

文章目錄 第四章&#xff1a;Ownership 所有權核心概念關鍵機制引用與借用&#xff08;Reference & Borrowing&#xff09;懸垂引用問題錯誤示例分析解決方案引用安全規則 切片&#xff08;Slice&#xff09;內存安全保證 第四章&#xff1a;Ownership 所有權 Ownership i…

一旦懂得,有趣得緊1:詞根tempt-(嘗試)的兩種解法

詞根tempt-嘗試 tempt vt.引誘&#xff1b;誘惑&#xff1b;慫恿&#xff1b;利誘&#xff1b;勸誘&#xff1b;鼓動 temptation n.引誘&#xff1b;誘惑 // tempt v.引誘 -ation 名詞后綴 attempt v.&n.嘗試&#xff0c;試圖 // at- 加強 tempt 嘗試contempt n.蔑視&am…

召喚數學精靈

1.召喚數學精靈 - 藍橋云課 問題描述 數學家們發現了兩種用于召喚強大的數學精靈的儀式&#xff0c;這兩種儀式分別被稱為累加法儀式 A(n) 和累乘法儀式 B(n)。 累加法儀式 A(n) 是將從1到 n 的所有數字進行累加求和&#xff0c;即&#xff1a; A(n)12?n 累乘法儀式 B(n) …

C語言實現查表8位SAE J1850 CRC

背景&#xff1a; 在做霍爾采集電流的時候&#xff0c;CSSV1500N 系列電流傳感器通過can數據輸出的報文需要做crc校驗&#xff0c;嵌入式常用查表的方式&#xff0c;所以就問了下deepseek怎么算這個CRC. 以下是使用 查表法&#xff08;Lookup Table&#xff09; 在C語言中高效…

【UE5.3.2】初學1:適合初學者的入門路線圖和建議

3D人物的動作制作 大神分析:3D人物的動作制作通常可以分為以下幾個步驟: 角色綁定(Rigging):將3D人物模型綁定到一個骨骼結構上,使得模型能夠進行動畫控制。 動畫制作(Animation):通過控制骨骼結構,制作出人物的各種動作,例如走路、跳躍、打斗等。 動畫編輯(Ani…

mapreduce的工作原理

MapReduce 是 Hadoop 中實現分布式并行計算的核心框架&#xff0c;其工作原理基于“分而治之”的思想&#xff0c;將大規模數據處理任務分解為 Map&#xff08;映射&#xff09; 和 Reduce&#xff08;歸約&#xff09; 兩個階段。 一、MapReduce 核心流程 1. Input 階段 - 輸…

換季推廣不好做?DeepBI用一鍵托管的方式,讓廣告投放跑得快、準、穩

每年換季&#xff0c;尤其是春夏、秋冬交替的節點&#xff0c;都是電商平臺上各類季節性商品扎堆上新的高峰期。無論是服飾鞋包、家居戶外&#xff0c;還是母嬰用品、美妝護膚&#xff0c;許多商品都有著強烈的“時間窗口效應”——一旦錯過了熱賣期&#xff0c;流量下滑迅速&a…

Qt5.14.2+Cmake使用mingw64位編譯opencv4.5成功圖文教程

? 一、下載安裝相關編譯環境軟件 1.1 Python3.8&#xff1a;安裝路徑:C:\Users\Administrator\AppData\Local\Programs\Python\Python38-32 安裝包&#xff1a;python3.8.exe 1.2 QT5.14.2&#xff1a;安裝路徑:C:\Qt\Qt5.14.2 1.3 opencv4.5&#xff1a;解壓路徑D:\o…

OpenBMC:BmcWeb 處理http請求3 字典樹查找節點

OpenBMC:BmcWeb 處理http請求2 查找路由對象-CSDN博客 findRouteByPerMethod實際上是調用了perMethod.trie.find(url);來查找路由對象的 class Trie {struct FindResult{unsigned ruleIndex;std::vector<std::string> params;};FindResult findHelper(const std::string…

Openssl自簽證書相關知識

1.前提 檢查是否已安裝 openssl $ which openssl /usr/bin/openssl 2.建立CA授權中心 2.1.生成ca私鑰(ca-prikey.pem) 初始化 OpenSSL 證書頒發機構(CA)的序列號文件 在生成證書時,ca.srl 的初始序列號需正確初始化(如 01),否則可能導致證書沖突 這會將 01 顯示在屏幕…

K個一組翻轉鏈表--囊括半數鏈表題的思想

K 個一組翻轉鏈表 這道算法題就是鏈表多個算法思想的結合&#xff0c;解決這一道leetcodehot100的鏈表題至少能做一半了 大概有一下幾個點 1.鏈表定位 2.鏈表翻轉 3.哨兵節點 4.鏈表合并 看看題目 給你鏈表的頭節點 head &#xff0c;每 k 個節點一組進行翻轉&#xff…

Flutter敏感詞過濾實戰:基于AC自動機的高效解決方案

Flutter敏感詞過濾實戰&#xff1a;基于AC自動機的高效解決方案 在社交、直播、論壇等UGC場景中&#xff0c;敏感詞過濾是保障平臺安全的關鍵防線。本文將深入解析基于AC自動機的Flutter敏感詞過濾實現方案&#xff0c;通過原理剖析實戰代碼性能對比&#xff0c;帶你打造毫秒級…

UML中的用例圖和類圖

在UML&#xff08;統一建模語言&#xff09;中&#xff0c;**用例圖&#xff08;Use Case Diagram&#xff09;和類圖&#xff08;Class Diagram&#xff09;**是兩種最常用的圖表類型&#xff0c;分別用于描述系統的高層功能和靜態結構。以下是它們的核心概念、用途及區別&…