首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 註解 深度解析:元註解、內建註解、自定義與反射解析實戰

     編輯:Java 相關知識

Annotation (註解) 是 JDK 1.5 引入的元數據機制,廣泛應用於 Spring、Hibernate 等框架。本文系統講解註解原理、四大元註解、三大內建註解、自定義註解規範與反射解析實戰。

一、核心概念與 API 概覽

註解不同於註釋:註解可被編譯工具/解析工具處理,註釋僅源碼保留。自定義註解必須用 @interface (隱含繼承 java.lang.annotation.Annotation)。

四大元註解

元註解作用關鍵屬性
@Documented標記的元素會被 javadoc 文檔化無
@Inherited註解可被子類自動繼承查找無
@Retention指定保留策略value(): RetentionPolicy
@Target限制適用程序元素類型value(): ElementType[]

RetentionPolicy (保留策略)

  • SOURCE:僅源文件,編譯捨棄
  • CLASS:源文件 + Class 字節碼,運行時 VM 不保留 (預設)
  • RUNTIME:源文件 + Class + 運行時 VM 保留,可反射讀取

ElementType (適用元素)

  • ANNOTATION_TYPE、CONSTRUCTOR、FIELD、LOCAL_VARIABLE、METHOD、PACKAGE、PARAMETER、TYPE (類/介面/枚舉/註解)

二、三大內建註解對比

註解TargetRetention用途
@OverrideMETHODSOURCE檢查是否正確覆寫父類方法
@Deprecated除 ANNOTATION_TYPE 外所有RUNTIME標記不建議使用,javadoc 建議說明替代方案
@SuppressWarnings除 ANNOTATION_TYPE、PACKAGE 外所有SOURCE壓制編譯器警告,value() 接受字串陣列

@SuppressWarnings 常用參數

  • deprecation、unchecked、fallthrough、path、serial、finally、all

三、自定義註解實戰

@Documented
@Target(ElementType.METHOD)
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface AuthorAnno {
    String name();                    // 必填
    String website() default "gityuan.com";  // 選填,有預設值
    int revision() default 1;
}

使用範例

public class AnnotationDemo {
    @AuthorAnno(name="yuanhh", website="gityuan.com", revision=1)
    public static void main(String[] args) { System.out.println("I am main"); }

    @SuppressWarnings({"unchecked", "deprecation"})
    @AuthorAnno(name="yuanhh", revision=2)
    public void demo() { System.out.println("I am demo"); }
}

四、反射解析註解

核心介面 AnnotatedElement (由 AccessibleObject 實現,Method/Class/Field 等繼承):

方法說明
getAnnotation(Class)取得指定類型註解,無則 null
getAnnotations()取得所有註解 (含繼承)
getDeclaredAnnotations()取得直接聲明的註解
isAnnotationPresent(Class)檢查是否存在指定註解

解析器實作

public class AnnotationParser {
    public static void main(String[] args) throws Exception {
        String clazz = "com.yuanhh.annotation.AnnotationDemo";
        Method[] methods = AnnotationParser.class.getClassLoader().loadClass(clazz).getMethods();
        for (Method method : methods) {
            if (method.isAnnotationPresent(AuthorAnno.class)) {
                AuthorAnno info = method.getAnnotation(AuthorAnno.class);
                System.out.println("method: " + method);
                System.out.println("name=" + info.name() + ", website=" + info.website() + ", revision=" + info.revision());
            }
        }
    }
}

輸出結果

method: public void com.yuanhh.annotation.AnnotationDemo.demo()
name= yuanhh , website= gityuan.com , revision= 2
method: public static void com.yuanhh.annotation.AnnotationDemo.main(String[])
name= yuanhh , website= gityuan.com , revision= 1

拿到註解資訊後可實現:自動代碼生成、運行時配置綁定、AOP 切點匹配、測試框架標記等進階功能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved