如何在Java中创建注解,类似于@name("Luke")这样的形式,但括号内没有属性?

55

我如何创建没有括号内属性名称的自定义Java注释?

我不想像这样: @annotation_name(att=valor)。我只想像在Servlets中一样:

@WebServlet("/main")
3个回答

64

使用名为value的属性定义注解,然后可以省略属性名:

@interface CustomAnnotation
{
    String value();
}

可以这样使用:

@CustomAnnotation("/main")
// ...

特殊属性名value在Java语言规范的"第9.6.1节. 注解接口元素"中进行了描述:

按照约定,单元素注解接口中唯一元素的名称为value。单元素注解(§9.7.3)提供对该约定的语言支持。


不要编译 :( 在Eclipse中会抛出一个错误,指示缺少属性。 - Lucas Batistussi
但是还没有起作用 :( @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Get { String name();} => @Get("hi") public void inserir() 抛出异常 - Lucas Batistussi
就像其他答案中指出的一样,它并不必须是唯一的属性。 - ctomek

38
您需要指定一个名为"value"的属性:
public @interface MyAnnotation {

    String value();

}

如果它们有默认值,这不必是唯一的属性:

public @interface MyAnnotation {

    String value();
    int myInteger() default 0;

}

但是如果你想为属性分配一个除value以外的值,那么你必须显式地为value属性分配一个值。也就是说:

@MyAnnotation("foo")
@MyAnnotation(value = "foo", myInteger = 1)

可以运行

但是有问题

@MyAnnotatino("foo", myInteger = 1)

不会


20

引用注释官方文档

如果只有一个名为value的元素,则可以省略名称,如下所示:

@SuppressWarnings("unchecked")
void myMethod() { }

这是该注解的定义方式:

public @interface SuppressWarnings {
  String[] value();
}

正如您所看到的,文档并不完全正确,还允许其他属性("just one element"),请参见WebServlet - 但名为value的属性会被特殊处理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接