介紹
注解(Annotation)是 JDK1.5 的新特性,是一種特殊的類,作用類似于注釋,相當(dāng)于是一個(gè)標(biāo)記,可以標(biāo)記在一個(gè)類身上的不同位置,可以修飾不同的成員變量、方法甚至是類。注解在實(shí)際開(kāi)發(fā)中用的非常廣泛,尤其是現(xiàn)在流行的基于注解式開(kāi)發(fā)。
定義
注解通過(guò) @interface 關(guān)鍵字進(jìn)行定義。
public @interface DemoAnnotation {
}
它的形式跟接口很類似,不過(guò)前面多了一個(gè) @ 符號(hào)。上面的代碼就創(chuàng)建了一個(gè)名字為 DemoAnnotation的注解。
應(yīng)用
@DemoAnnotation
public class Test {
}
創(chuàng)建一個(gè)類 Test,然后在類定義的地方加上 @DemoAnnotation 可以用 DemoAnnotation 注解這個(gè)類。
屬性
注解的屬性即成員變量。注解只有成員變量,沒(méi)有方法。注解的成員變量在注解的定義中以“無(wú)形參的方法”形式來(lái)聲明,其方法名定義了該成員變量的名字,其返回值定義了該成員變量的類型。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface DemoAnnotation {
int id();
String msg();
}
上面代碼定義了 DemoAnnotation 這個(gè)注解中擁有 id 和 msg 兩個(gè)屬性。在使用的時(shí)候,應(yīng)該給它們進(jìn)行賦值。
賦值的方式是在注解的括號(hào)內(nèi)以 value=”” 形式,多個(gè)屬性之前用 ,隔開(kāi)。
@DemoAnnotation(id=3,msg="hi annotation")
public class Test {
}
需要注意的是,在注解中定義屬性時(shí)它的類型必須是 8 種基本數(shù)據(jù)類型外加 類、接口、注解及它們的數(shù)組。注解中屬性可以有默認(rèn)值,默認(rèn)值需要用 default 關(guān)鍵值指定。比如:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface DemoAnnotation {
public int id() default -1;
public String msg() default "Hi";
}
DemoAnnotation 中:
- id 屬性默認(rèn)值為 -1
- msg 屬性默認(rèn)值為 Hi
它可以這樣應(yīng)用。
@DemoAnnotation()
public class Test {}
因?yàn)橛心J(rèn)值,所以無(wú)需要再在 @DemoAnnotation 后面的括號(hào)里面進(jìn)行賦值了,這一步可以省略。另外,還有一種情況。如果一個(gè)注解內(nèi)僅僅只有一個(gè)名字為 value 的屬性時(shí),應(yīng)用這個(gè)注解時(shí)可以直接接屬性值填寫(xiě)到括號(hào)內(nèi)。
public @interface DemoAnnotation {
String value();
}
上面代碼中,DemoAnnotation 這個(gè)注解只有 value 這個(gè)屬性。所以可以這樣應(yīng)用。
@DemoAnnotation("hi")
這和下面的效果是一樣的
@DemoAnnotation(value="hi")
最后,還需要注意的一種情況是一個(gè)注解沒(méi)有任何屬性。比如
public @interface DemoAnnotation {}
那么在應(yīng)用這個(gè)注解的時(shí)候,括號(hào)都可以省略。
@DemoAnnotation
public void testMethod(){}
分類
注解可以分為四大類: