Java編程思想(七)第20章-註解

目錄:

Java編程思想(一)第1~13、16章
Java編程思想(二)第14章-類型信息
Java編程思想(三)第15章-泛型
Java編程思想(四)第17章-容器深入研究
Java編程思想(五)第18章-Java IO系統
Java編程思想(六)第19章-枚舉類型
Java編程思想(七)第20章-註解
Java編程思想(八)第21章-併發

  註解(也被稱爲元數據)爲我們在代碼中添加信息提供了一種形式化的方法,使我們可以在稍後某個時刻非常方便地使用這些數據。

1 基本語法

  被註解的方法與其他的方法沒有區別。註解可以與任何修飾符共同作用於方法,例如,public, static或void。從語法的角度來看,註解的使用方式幾乎與修飾符的使用一模一樣。

1.1 定義註解

  註解的定義看起來很像接口的定義。事實上,與其他任何Java接口一樣,註解也將會編譯成class文件

  定義註解時會需要一些元註解(meta-annotation),如@Target@Retention

  在註解中,一般都會包含一些元素以表示某些值。當分析處理註解時,程序或工具可以利用這些值。註解的元素看起來就像接口的方法,唯一的區別是你可以爲其指定默認值。元素的類型有限制。

  沒有元素的註解稱爲標記註解(marker annotation)

  所有註解都繼承了annotation

package net.mrliuli.annotations;

import java.lang.annotation.*;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Test {} //(marker annotation)

1.2 三種標準註解和四種元註解

  定義在java.lang中的三種標準註解:

  • @Overrided
  • @Deprecated
  • @SuppressWarnings

  四種元註解:

  • @Target 表示該註解可以用於什麼地方。
  • @Retension 表示需要在什麼級別保存該註解信息。
  • @Documented 將此註解包含在Javadoc中。
  • @Inherited 允許子類繼承父類中的註解。

1.3 關於註解

  • 註解元素的類型有限制,不可以是任意類型,使用除允許類型以外的類型編譯器會報錯。
  • 默認值限制:

    • 首先,元素不能有不確定的值。也就是說,元素必須要麼具有默認值,要麼在使用註解時提供元素的值。
    • 其次,對於非基本類型的元素,無論是在源代碼中聲明時,或是在註解接口中定義默認值時,都不能以null作爲其值。這個約束使得註解處理器很難表現一個元素的存在或缺失的狀態,因爲在每個註解的聲明中,所有的元素都存在,並且都具有相應的值。爲了繞開這個約束,我們只能自己定義一些特殊的值例如空字符串或負數,以此表示某個元素不存在:
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface SimulationNull{
        public int id() default -1;
        public String description() default "";
    }
  • 生成外部文件。有些framework需要一些額外的信息才能與你的源代碼協同工作,而這種情況最適合註解表現其價值了。像Enterprise JavaBean這樣的技術,需要部署描述文件。Web Service、自定義標籤庫以及對象/關係映射工具(如Toplink和Hibernate)等,一般都需要XML描述文件,而這些描述文件脫離於源代碼之外。

2 編寫註解處理器

  使用註解的過程中,很重要的一部分就是創建與使用註解處理器用來讀取註解

  • 反射機制的API可以構造註解處理器
  • 外部工具apt可以解析帶有註解的Java源代碼
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章