Java注解用法
注解元素的提供值必須是編譯時(shí)常量表達(dá)式,不能使用null
作為注解中任何類型元素的值。
注解類型中的元素的數(shù)據(jù)類型可以是任何基本數(shù)據(jù)類型:byte
,short
,int
,long
,float
,double
,boolean
和 char
。
Version
注釋類型聲明兩個元素:major
和minor
,并且都是int
數(shù)據(jù)類型。
以下代碼聲明了注解類型:
public @interface MyAnnotation {
byte a();
short b();
int c();
long d();
float e();
double f();
boolean g();
char h();
}
@MyAnnotation(a=1, b=2, c=3, d=4, e=12.34F, f=1.89, g=true, h='Y')
可以使用編譯時(shí)常量表達(dá)式來指定注解元素的值。以下兩個版本注釋實(shí)例有效的:
@Version(major=2+1, minor=(int)13.2)
@Version(major=3, minor=13)
可以在注釋類型中使用String
類型的元素。以下代碼定義了名為Name
的注解類型。 它有兩個元素:first
和last
,它們都是String
類型。
public @interface Name {
String first();
String last();
}
@Name(first="Tom", last="Smith")
public class NameTest {
@Name(first="Jack", last="Iaan")
public void aMethod() {
}
}
在String
類型的元素的值表達(dá)式中使用字符串連接+
運(yùn)算符是有效的。
@Name(first="Ja" + "ck", last="Ia" + "an")
以下代碼顯示如何使用Class
類型作為注解值。
import java.io.IOException;
@interface MyAnnotation {
Class<? extends Throwable> willThrow() default java.lang.Throwable.class;
}
public class Main {
@MyAnnotation(willThrow = IOException.class)
public static void testCase1() {
// Code goes here
}
@MyAnnotation()
public static void testCase2() {
}
}
注解可以具有枚舉類型的元素。
enum Level {
PENDING, FAILED, PASSED;
}
@interface Review {
Level status() default Level.PENDING;
String comments() default "";
}
@Review(status = Level.PASSED)
public class Main {
}
可以使用注解類型作為另一個注解類型的聲明內(nèi)的元素的類型。要為注解類型的元素提供值,請使用用于創(chuàng)建注解類型實(shí)例的語法。
@interface Name {
String first();
String last();
}
@interface Version {
int major();
int minor() default 0; // zero as default value for minor
}
@interface Description {
Name name();
Version version();
String comments() default "";
}
@Description(name = @Name(first = "Tom", last = "Smith"), version = @Version(major = 1, minor = 2), comments = "Just a test class")
public class Main {
}
注解可以具有數(shù)組類型的元素。數(shù)組類型可以是以下類型之一:
java.lang.String
類型java.lang.Class
類型需要在大括號中指定數(shù)組元素的值。數(shù)組的元素由逗號分隔。
@interface ItemList {
String[] items();
}
@ItemList(items = { "A", "B" })
public class Main {
}
如果數(shù)組中只有一個元素,則允許省略括號。
@ToDo(items={"A"})
@ToDo(items="A")
傳遞一個空數(shù)組
@ToDo(items={})
假設(shè)有一個注釋類型如下。
public @interface Enabled {
boolean status() default true;
}
要使用帶有默認(rèn)值的Enabled
注解類型注釋程序元素,可以使用@Enabled()
語法。
不需要為status
元素指定值,因?yàn)樗哂心J(rèn)值??梢赃M(jìn)一步省略括號。
@Enabled
public class Main {
}
@Enabled()
public class Main {
}
只有一個元素的注解類型有速記語法。如果注釋類型只有一個具有命名值的元素,可以省略name = value
對中的名稱。以下代碼聲明了 Company
注解類型,它只有一個名為value
的元素:
public @interface Company {
String value();
}
當(dāng)使用 Company
注釋時(shí),可以省略name = value
對的名稱。
@Company(value="Inc.")
public class Test {
}
變成 -
@Company("Inc.")
public class Test {
}
以下代碼顯示了如果元素?cái)?shù)據(jù)類型是數(shù)組,如何使用縮寫。
public @interface Item {
String[] value();
}
@Item({"A", "B"})
public class Test {
}
如果在數(shù)組注釋類型中只指定一個元素,可以進(jìn)一步省略括號。
@Item("A")
public class Test {
}
如果在使用注釋時(shí)只提供一個值,則元素的名稱為假設(shè)那個值。