一、理論說明
1. 注解的定義
Java 注解是從 JDK 5.0 開始引入的一種元數據機制,它可以為代碼添加額外的信息,這些信息不影響程序的運行邏輯,但可以在編譯期、類加載期或運行期被讀取和處理。注解本質上是一種特殊的接口,所有注解都自動繼承java.lang.annotation.Annotation
接口。注解可以應用于類、方法、字段、參數等程序元素上,用于實現如代碼檢查、配置信息、生成文檔等功能。
2. 內置注解與自定義注解的區別
- 定義方式:
- 內置注解是 Java 語言自帶的,在
java.lang
、java.lang.annotation
等包中已經定義好,例如@Override
、@Deprecated
、@SuppressWarnings
等,開發者可以直接使用。 - 自定義注解需要開發者自己使用
@interface
關鍵字來定義新的注解類型,通過元注解(如@Retention
、@Target
等)來指定注解的保留策略和適用范圍 。
- 內置注解是 Java 語言自帶的,在
- 功能特性:
- 內置注解具有特定的、固定的功能。比如
@Override
用于確保方法正確重寫父類方法,編譯器會進行檢查;@Deprecated
用于標記不建議使用的代碼元素,提醒開發者避免使用 。 - 自定義注解功能更加靈活,開發者可以根據具體需求定義注解的屬性和處理邏輯,用于實現特定的業務邏輯,如自定義的權限控制、數據校驗等。
- 內置注解具有特定的、固定的功能。比如
- 使用場景:
- 內置注解適用于通用的、常見的代碼標注場景,是 Java 語言為了提高代碼質量和開發效率提供的基礎工具 。
- 自定義注解適用于項目中特定的、個性化的需求,例如在 Web 開發中定義注解來處理請求日志記錄、在持久化層定義注解來映射數據庫表結構等。
二、常用注解與元注解
1. 內置常用注解
@Override
用于標識一個方法是重寫父類的方法。如果被注解的方法并非真正重寫父類方法,編譯器會報錯。例如:
class Animal {public void speak() {System.out.println("動物發出聲音");}
}class Dog extends Animal {@Overridepublic void speak() {System.out.println("狗汪汪叫");}
}
@Deprecated
用于標記不再建議使用的類、方法或字段。當其他開發者使用被該注解標記的元素時,編譯器會給出警告。例如:
@Deprecated
public void oldMethod() {System.out.println("這是一個不再建議使用的方法");
}
@SuppressWarnings
用于抑制編譯器產生的警告信息。可以通過指定警告類型,如unchecked
(抑制未檢查類型轉換警告)、deprecation
(抑制使用已過時元素的警告)等。例如:
import java.util.ArrayList;
import java.util.List;public class Main {@SuppressWarnings("unchecked")public static void main(String[] args) {List list = new ArrayList();list.add("元素");}
}
2. 元注解
@Retention
用于指定注解的保留策略,即注解在什么階段還存在。@Retention
有三個取值:
四、面試題
題目:
答案:
五、自我總結
通過對 Java 注解的學習,我們掌握了一種強大且靈活的元數據添加方式。內置注解在日常開發中能有效提高代碼質量和規范性,而自定義注解結合元注解,為滿足個性化業務需求提供了有力工具。掌握@Override
、@Deprecated
、@SuppressWarnings
等內置注解,以及@Retention
、@Target
等元注解的使用,能讓我們在實際編程中根據不同場景合理運用注解。在實際應用場景中,如代碼規范檢查、框架配置、日志記錄等方面,注解都能發揮重要作用。合理使用注解不僅可以使代碼結構更清晰,還能提高代碼的可維護性和擴展性,在大型項目開發和框架設計中具有重要意義 。
RetentionPolicy.SOURCE
:注解只保留在源文件中,編譯成字節碼文件時就會被丟棄,例如@Override
注解。RetentionPolicy.CLASS
:注解保留在字節碼文件中,但在運行時無法獲取,這是默認的保留策略。RetentionPolicy.RUNTIME
:注解不僅保留在字節碼文件中,在運行時也可以通過反射獲取和處理。例如:import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy;@Retention(RetentionPolicy.RUNTIME) @interface MyRuntimeAnnotation {}
@Target
用于指定注解可以應用的程序元素類型,如類、方法、字段等。
@Target
的取值包括:ElementType.TYPE
:應用于類、接口、枚舉等類型。ElementType.METHOD
:應用于方法。ElementType.FIELD
:應用于字段。
例如:import java.lang.annotation.ElementType; import java.lang.annotation.Target;@Target(ElementType.METHOD) @interface MyMethodAnnotation {}
三、應用實例
以下代碼展示了自定義注解及其使用和處理:
import java.lang.annotation.*; import java.lang.reflect.Method;// 定義自定義注解 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) @interface Loggable {String value() default ""; }class Calculator {@Loggable("執行加法運算")public int add(int a, int b) {return a + b;}public int subtract(int a, int b) {return a - b;} }public class Main {public static void main(String[] args) throws NoSuchMethodException {Calculator calculator = new Calculator();Method addMethod = calculator.getClass().getMethod("add", int.class, int.class);if (addMethod.isAnnotationPresent(Loggable.class)) {Loggable loggable = addMethod.getAnnotation(Loggable.class);System.out.println("注解信息: " + loggable.value());}int result = calculator.add(3, 5);System.out.println("計算結果: " + result);} }
代碼解釋
- 定義自定義注解:使用
@interface
關鍵字定義Loggable
注解,通過@Retention(RetentionPolicy.RUNTIME)
指定該注解在運行時可用,@Target(ElementType.METHOD)
指定該注解只能應用于方法上,同時定義了一個value
屬性。 - 使用注解:在
Calculator
類的add
方法上使用@Loggable
注解,并設置value
屬性為 “執行加法運算” 。 - 處理注解:在
main
方法中,通過反射獲取add
方法,使用isAnnotationPresent
方法檢查該方法是否存在Loggable
注解。如果存在,則使用getAnnotation
方法獲取注解實例,并輸出注解的value
屬性值,最后調用add
方法進行計算并輸出結果。