注解
注解是一种特殊的接口,专门用于注释代码。注解是一种超接口,是Annotation接口类型,声明注解与声明接口类似,需要使用@interface关键字。注解可以通过无主体方法的形式定义成员,并且可以选择使用default设置默认值。注解成员的类型仅限于:原始类型、字符串、类、枚举、其他注释类型,或者这些类型的数组。Groovy中注解可以改变语言的语义,尤其是AST转换,会根据注解生成代码。@interface SomeAnnotation {
String value()
}
@interface SomeAnnotation {
String value() default 'something'
}
@interface SomeAnnotation {
int step()
}
@interface SomeAnnotation {
Class appliesTo()
}
@interface SomeAnnotation {}
@interface SomeAnnotations {
SomeAnnotation[] value()
}
enum DayOfWeek { mon, tue, wed, thu, fri, sat, sun }
@interface Scheduled {
DayOfWeek dayOfWeek()
}
注解可以用于代码的各种元素。为了限制注解的应用范围,在定义注解时需要使用Target注解。可选的目标可以参考
ElementType。使用注解时所有没有默认值的成员都要设置值,通过“成员名=”的形式设置成员的值,如果只有一个需要设置值的成员,可以省略成“成员名=”。
@interface Page {
String value()
int statusCode() default 200
}
@Page(value='/home')
void home() {
// ...
}
@Page('/users')
void userList() {
// ...
}
@Page(value='error',statusCode=404)
void notFound() {
// ...
}
注解的可见性依赖于它的保持策略,可选的保持策略可以参考
RetentionPolicy。策略的选择通常取决于您是否希望在编译时或运行时显示注释。
import java.lang.annotation.Retention
import java.lang.annotation.RetentionPolicy
@Retention(RetentionPolicy.SOURCE)
@interface SomeAnnotation {}
Groovy中的注解有一个特性是,可以使用闭包做为注解的值。
class Tasks {
Set result = []
void alwaysExecuted() {
result << 1
}
@OnlyIf({ jdk>=6 })
void supportedOnlyInJDK6() {
result << 'JDK 6'
}
@OnlyIf({ jdk>=7 && windows })
void requiresJDK7AndWindows() {
result << 'JDK 7 Windows'
}
}
元注解,也叫注解别名,是在编译时由其他注解替换的注解。元注解与普通注解的声明方式相同,但是由@AnnotationCollector注解和注解列表注释,Groovy支持预编译和源表单元注解。Groovy支持预编译和源表单注解,注解可以是预编译的,也可以与正在编译的源代码树放在同一源树中,元注解只能用于Groovy。当Groovy编译器遇到带有元注解的类时,会用元注解收集到的注解替换它。