首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java註解@:作用分類、元註解與自定義註解實戰指南

     編輯:程式設計綜合問答

代碼前的`@WebFilter`、`@WebInitParam`是**Java註解**,JDK 1.5引入,本質是**接口一種特殊形式**,用於為代碼提供元數據。本文系統講解註解三大作用、元註解、內置註解與自定義實戰。

註解三大核心作用

分類階段機制典型例子
編寫文檔源碼期javadoc工具提取生成API文檔`@author`、`@version`、`@param`、`@return`、`@see`
代碼分析/檢查編譯期/靜態分析編譯器/IDE/檢查工具(ErrorProne、SpotBugs)讀取註解執行邏輯`@Override`、`@Deprecated`、`@SuppressWarnings`、`@NonNull`、`@Nullable`
運行時處理運行時反射API讀取註解屬性,驅動框架邏輯(DI、AOP、映射、驗證)Spring `@Autowired`、`@Transactional`、JPA `@Entity`、JAX-RS `@Path`、本例 `@WebFilter`

元註解:註解的註解(定義註解行為)


@Target(ElementType.TYPE)        // 作用目標:類/接口/方法/字段/參數/構造器/局部變量/註解/包/類型參數/類型使用
@Retention(RetentionPolicy.RUNTIME) // 生命周期:SOURCE(源碼丟棄) / CLASS(編譯保留,默認) / RUNTIME(運行時反射可見)
@Documented                      // 包含在javadoc中
@Inherited                       // 子類自動繼承父類此註解(僅针對TYPE)
@Repeatable(Container.class)     // 同一位置可重複使用 (Java 8+)
public @interface MyAnnotation { ... }

內置核心註解

  • `@Override`:強制檢查方法確實覆寫父類/接口方法,防止拼寫錯誤/簽名不匹配。
  • `@Deprecated`:標記過時,編譯警告,文檔標註。
  • `@SuppressWarnings("unchecked")`:抑制特定編譯器警告。
  • `@SafeVarargs`:聲明可變參數方法類型安全(Java 7+)。
  • `@FunctionalInterface`:標記函數式接口(單一抽象方法),編譯器強制檢查(Java 8+)。

實戰:Servlet 3.0+ 註解配置替代 web.xml


// 原問題代碼即為此類
@WebFilter(
    filterName = "authority",
    urlPatterns = {"/*"},
    initParams = {
        @WebInitParam(name = "encoding", value = "UTF-8"), // 建議UTF-8
        @WebInitParam(name = "loginPage", value = "/login.jsp"),
        @WebInitParam(name = "proLogin", value = "/proLogin.jsp")
    }
)
public class AuthorityFilter implements Filter {
    // initParams 可在 init(FilterConfig config) 中獲取
    // config.getInitParameter("encoding")
    @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) 
            throws IOException, ServletException {
        // 認證邏輯
        chain.doFilter(req, res);
    }
}
  • 容器啟動時掃描帶`@WebFilter`/`@WebServlet`/`@WebListener`的類,自動註冊,無需`web.xml`。
  • `@WebInitParam`等價於``。

自定義註解 + 反射處理器模板


// 1. 定義
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LogExecutionTime {
    String value() default ""; // 自定義屬性
}

// 2. 使用
public class Service {
    @LogExecutionTime("用戶登錄")
    public void login() { ... }
}

// 3. 運行時處理(AOP切面/代理/掃描器)
public class AnnotationProcessor {
    public void process(Object bean) {
        for (Method m : bean.getClass().getDeclaredMethods()) {
            if (m.isAnnotationPresent(LogExecutionTime.class)) {
                LogExecutionTime ann = m.getAnnotation(LogExecutionTime.class);
                String label = ann.value();
                // 織入邏輯:計時、日誌、權限...
                long start = System.nanoTime();
                m.invoke(bean);
                System.out.println(label + " 耗時: " + (System.nanoTime() - start) + "ns");
            }
        }
    }
}

最佳實踐建議

  1. 業務註解用RUNTIME,配合反射/AOP實現框架功能。
  2. 檢查類註解用CLASS/SOURCE,編譯期生效無運行開銷。
  3. 善用元註解限制目標(`@Target`),防止濫用。
  4. 屬性預設值(`default ""`)簡化使用。
  5. 命名規範:功能性註解用動詞/名詞(`@Transactional`),標記類用形容詞(`@Deprecated`)。
註解本質:代碼層面的結構化元數據,將「說明」變為「可計算、可驅動邏輯」的機器可讀信息。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved