最近我看到了一个使用注释验证字段的示例:
Class Foo{
@Min(2)
int x;
}
我知道我可以访问注释接口中声明的函数,如:
//UPDATE: missing code
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface Min {
int x() default 0;
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface Afoo {
String msg() default "Oy!";
}
@Afoo(msg = "Hi!")
class Foo{
// @Min(3)
public int x;
}
public class Test{
public static void main(String[] args) {
Class c = Foo.class;
Annotation an = c.getAnnotation(Afoo.class);
Afoo a = (Afoo)an;
System.out.println(a.msg());
}
}
但是,当我取消注释该行时
// @Min(3)
并创建一个名为Min
的新注释界面,我有一个错误说:
注释类型不适用于此类声明。
所以,即使我可以访问此功能,我怎么知道它与x
有关?
假设你自己版本的Min
注释的声明本身用@Target(ElementType.TYPE)
注释,@Target
是错误的。 ElementType.TYPE
是for classes, interfaces and enum declarations。您不想注释类型,您想要注释字段x
。使用
@Target(ElementType.FIELD)
代替。