您可以自订Annotation型别,并使用这些自订的Annotation型别在程序代码中使用 Annotation,这些Annotation将提供信息给您的程序代码分析工具。
首先来看看如何定义Marker Annotation,也就是Annotation名称本身即提供信息,对于程序分析工具来说,主要是检查是否有Marker Annotation的出现,并作出对应的动作。
要定义一个Annotation所需的动作,就类似于定义一个接口(interface),只不过您使用的是@interface,例如定义一个 Debug Annotation型态:
package onlyfun.caterpillar;
public @interface Debug {}
由于是个Marker Annotation,所以没有任何的成员在里头,编译完成后,您就可以在程序代码中使用这个Annotation了,例如:
package onlyfun.caterpillar;
import java.util.*;
public class SomeObject {
@Debug?
public void doSomething() {
// ....
}
}
接着来看看如何定义一个Single-value Annotation,它只有一个成员,名称为value,例如您可以提供Debug Annotation更多信息:
package onlyfun.caterpillar;
public @interface Debug {
String value();
}
实际上您定义了value()方法,编译器在编译时会自动帮您产生一个value的变量成员,接着在使用Debug Annotation时要指定值,例如:
package onlyfun.caterpillar;
import java.util.*;
public class SomeObject {
@Debug("unit test")
public void doSomething() {
// ....
}
}
@Debug("unit test")实际上是@Debug(value="unit test")的简便写法,如果是数组值,例如:
package onlyfun.caterpillar;
public @interface Debug {
String[] value();
}
则使用Annotation时,可以写成@Debug({"value1", "value2"}),或是@Debug(value={"value1",
"value2"})。
您也可以对成员设定默认值,使用default关键词即可,例如:
package onlyfun.caterpillar;
public @interface Debug {
String value() default "none";
}
这么一来如果您使用@Debug时没有指定值,则预设就是"none"。
您也可以为Annotation定义额外的成员,以提供额外的信息给分析工具,例如:
package onlyfun.caterpillar;
public @interface Debug {
public enum Level {NONE, UNIT, INTEGRATION, FUNCTION};
Level level() default Level.NONE;
String name();
String tester();
}
则您可以如下使用这个Annotation:
package onlyfun.caterpillar;
import java.util.*;
public class SomeObject {
@Debug(
level = Debug.Level.UNIT,
name = "some test",
tester = "justin"
)
public void doSomething() {
// ....
}
}
@interface实际上是自动继承自java.lang.annotation.Annotation,所以定义Annotation时不能继承其它 Annotation或是interface。