Java的基本使用之注解(Annotation)
1、注解的基本介紹
注解就是放在 Java 代碼的類、方法、字段、參數(shù)前的一種特殊“注釋”。注解的格式:@注解名稱(屬性名=屬性值, 屬性名=屬性值)。
注解可以像修飾符一樣使用,可用于修飾包、類、構(gòu)造器、方法成員變量、參數(shù)、局部變量。使用注解可以簡化一些配置。注釋會被編譯器直接忽略,而注解則可以被編譯器打包進(jìn)入 class 文件,因此,注解是一種用作標(biāo)注的“元數(shù)據(jù)”。
@Resource("hello")
public class Hello {
@Inject
int n;
@PostConstruct
public void hello(@Param String name) {
System.out.println(name);
}
@Override
public String toString() {
return "Hello";
}
}
如何使用注解由工具決定,注解本身對代碼邏輯沒有影響。
1.1、注解的分類
Java的注解可以分為三類:
第一類是由編譯器使用的注解,這類注解不會被編譯進(jìn)入.class文件,它們在編譯后就被編譯器扔掉了。例如:
@Override:讓編譯器檢查該方法是否正確地實現(xiàn)了覆寫;@SuppressWarnings:告訴編譯器忽略此處代碼產(chǎn)生的警告。
第二類是由工具處理.class文件使用的注解,比如有些工具會在加載class的時候,對class做動態(tài)修改,實現(xiàn)一些特殊的功能。這類注解會被編譯進(jìn)入.class文件,但加載結(jié)束后并不會存在于內(nèi)存中。這類注解一般只被一些底層庫使用,我們很少用到。
第三類是在程序運(yùn)行期能夠讀取的注解,它們在加載后一直存在于JVM中,這也是最常用的注解。例如,一個配置了@PostConstruct的方法會在調(diào)用構(gòu)造方法后自動被調(diào)用(這是Java代碼讀取該注解實現(xiàn)的功能,JVM并不會識別該注解)。
2、使用注解
使用注解時,可以添加參數(shù)值。參數(shù)值必須是確定的,注解的參數(shù)值可以有默認(rèn)值,缺少某個配置參數(shù)時將使用默認(rèn)值。如果不寫參數(shù)值,相當(dāng)于全部參數(shù)都使用默認(rèn)值。
此外,大部分注解會有一個名為value的配置參數(shù),當(dāng)注解的參數(shù)中沒有參數(shù)名,只有一個參數(shù)值并且該注解是有 value 參數(shù)的,則表示的是給 value 參數(shù)賦值。
public class Hello { @Check(min=0, max=100, value=55) public int n; @Check(value=99) public int p; @Check(99) // 相當(dāng)于@Check(value=99) public int x; @Check public int y; }
上面代碼中,@Check就是一個注解。第一個@Check(min=0, max=100, value=55)明確定義了三個參數(shù),第二個@Check(value=99)只定義了一個value參數(shù),它實際上和@Check(99)是完全一樣的。最后一個@Check表示所有參數(shù)都使用默認(rèn)值。
3、定義注解(@interface)
通常來說并不需要自定義一個注解,但如果需要,我們可以使用@interface語法來定義注解(Annotation)。注解的參數(shù)類似無參數(shù)方法,可以用default設(shè)定一個默認(rèn)值(強(qiáng)烈推薦),最常用的參數(shù)應(yīng)當(dāng)命名為value。
聲明一個注解要用到的東西:
- 修飾符:訪問修飾符必須為public,不寫默認(rèn)為pubic;
- 關(guān)鍵字:關(guān)鍵字為@interface;
- 注解名稱:注解名稱為自定義注解的名稱,使用時還會用到;
- 注解類型元素:注解類型元素是注解中內(nèi)容,可以理解成自定義接口的實現(xiàn)部分;
public @interface Report { int type() default 0; String level() default "info"; String value() default ""; }
@interface用于定義注解接口,接口中只能定義成員變量,且定義的成員變量必須以()結(jié)尾,可以有default關(guān)鍵字來指定默認(rèn)值,如果沒有default,則在使用注解時必須賦值。
3.1、元注解(meta annotation)
有一些注解可以修飾其他注解,這些注解就稱為元注解(meta annotation)。Java標(biāo)準(zhǔn)庫已經(jīng)定義了一些元注解,主要有@Target、@Retention、@Document、@Inherited 用來修飾注解,一般我們只需要使用元注解,通常不需要自己去編寫元注解。
3.1.1、@Target
最常用的元注解是@Target。使用@Target可以定義Annotation能夠用于Java代碼中的哪些地方:

例如,定義注解@Report可用在方法上,我們必須添加一個@Target(ElementType.METHOD):
@Target(ElementType.METHOD) public @interface Report { int type() default 0; String level() default "info"; String value() default ""; }
3.1.2、@Retention
另一個重要的元注解@Retention定義了Annotation的生命周期:

如果@Retention不存在,則該Annotation默認(rèn)為CLASS。通常我們自定義的Annotation都是RUNTIME,所以要加上@Retention(RetentionPolicy.RUNTIME)這個元注解:
@Retention(RetentionPolicy.RUNTIME) public @interface Report { int type() default 0; String level() default "info"; String value() default ""; }
3.1.3、@Document
表明該注解標(biāo)記的元素可以被Javadoc 或類似的工具文檔化
3.1.4、@Inherited
表明使用了@Inherited注解的注解,所標(biāo)記的類的子類也會擁有這個注解

浙公網(wǎng)安備 33010602011771號