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

Java 註解原理與自定義註解完整指南

     編輯:Java 相關知識

前言:從 @Override 到元註解

當我們在方法上標註 @Override 時,編譯器會檢查是否真正覆蓋了父類方法;運行期 JVM 則不保留該註解。這背後是 註解保留策略 與 處理器機制 協作的結果。本文系統講解註解生命週期、元註解、自定義註解定義、反射讀取,並延伸至 Servlet 3.0、Spring/Hibernate、ADF 框架中的實戰應用。

一、四大元註解詳解

JDK 5.0 在 java.lang.annotation 提供四大元註解,專門「註解其他註解」:

元註解作用關鍵屬性/值
@Documented 標記是否納入 Javadoc 無屬性,標記型
@Retention 聲明生命週期 SOURCE(編譯期丟棄)、CLASS(類加載丟棄,默認)、RUNTIME(運行期保留,可反射讀取)
@Target 限制註解使用位置 ElementType.TYPE/FIELD/METHOD/PARAMETER/CONSTRUCTOR/LOCAL_VARIABLE/ANNOTATION_TYPE/PACKAGE
@Inherited 允許子類繼承父類註解 僅對 TYPE 生效

保留策略選擇指南

  • SOURCE:@Override、@SuppressWarnings — 僅供編譯器檢查。
  • CLASS:字節碼分析工具(如 Lombok 編譯期處理)。
  • RUNTIME:自定義註解首選,配合反射實現框架級功能(路由映射、事務控制、驗證等)。

二、自定義註解語法規範

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@interface Todo {
    enum Priority { LOW, MEDIUM, HIGH }
    enum Status { STARTED, NOT_STARTED }

    String author() default "Yash";
    Priority priority() default Priority.LOW;
    Status status() default Status.NOT_STARTED;
}

規則:

  • 只支持基本類型、String、Class、枚舉、註解類型、及其數組。
  • 屬性以「無參方法」形式聲明,允許 default 指定預設值。
  • 單屬性慣命名為 value(),使用時可省略屬性名:@Author("Yash")。

三、運行期反射讀取註解

Class<?> clazz = BusinessLogic.class;
for (Method m : clazz.getMethods()) {
    Todo todo = m.getAnnotation(Todo.class);
    if (todo != null) {
        System.out.println("Method: " + m.getName());
        System.out.println("Author: " + todo.author());
        System.out.println("Priority: " + todo.priority());
    }
}

核心 API:getAnnotation(Class<T>)、getAnnotations()、isAnnotationPresent()。

四、主流框架中的註解實戰

1. Servlet 3.0+ 核心註解

註解用途
@WebServlet聲明 Servlet 配置(替代 web.xml)
@WebFilter聲明 Filter
@WebListener聲明 Listener
@ServletSecurityHTTP 安全約束
@MultipartConfig文件上傳配置

2. Spring / Hibernate 大量應用註解驅動開發

  • Spring:@Component、@Autowired、@Transactional、@RequestMapping 等,結合 AOP 在切面織入邏輯。
  • Hibernate/JPA:@Entity、@Table、@Id、@Column、@OneToMany 等,替代 XML 映射。

註解優於標記接口:可針對單個方法/字段定義元數據,粒度更細。

3. Oracle ADF 的限制與變通

ADF 不採用 AOP,註解無法直接通過切面攔截。若需註解驅動功能,須採用繼承/模板方法或手動掃描反射在基類中統一處理。

五、最佳實踐總結

  1. 自定義註解務必標註 @Retention(RUNTIME),否則反射讀不到。
  2. @Target 精確限定使用位置,防止濫用。
  3. 屬性類型保持簡單,避免複雜對象圖導致序列化/反射困難。
  4. 配合 AnnotationProcessor(編譯期)或反射(運行期)實現具體邏輯,註解本身「不執行代碼」。

掌握註解機制,是從「使用框架」進階到「構建框架」的關鍵一步。

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