哪些types可以用于Java注释成员?

今天,我想创build我的第一个注释接口下面的文档 ,我得到了编译器错误“注释成员的无效types”:

public @interface MyAnnotation { Object myParameter; ^^^^^^ } 

显然, Object不能用作注释成员的types。 不幸的是,我找不到关于哪些types可以用于一般的任何信息。

这个我发现了使用反复试验:

String -->有效

int -->有效

Integer -->无效(令人惊讶)

String[] -->有效(令人惊讶)

Object -->无效

也许有人可以说明哪些types实际上是允许的,为什么。

它由JLS的第9.6.1节规定。 注释成员types必须是以下之一:

  • 原始
  • 一个枚举
  • 另一个注释
  • 上述任何一个数组

这似乎是限制性的,但毫无疑问是有原因的。

还要注意,multidimensional array(例如String[][] )被上述规则隐式禁止。

我同意Skaffman提供的types。

额外的限制:它必须是一个编译时常量

例如,以下是禁止的:

 @MyAnnot("a" + myConstantStringMethod()) @MyAnnot(1 + myConstantIntMethod()) 

另外不要忘记, 注释本身可以是注释定义的一部分 。 这允许一些简单的注释嵌套 – 在希望多次出现一个注释的情况下方便。

例如:

 @ComplexAnnotation({ @SimpleAnnotation(a="...", b=3), @SimpleAnnotation(a="...", b=3), @SimpleAnnotation(a="...", b=3) }) public Object foo() {...} 

SimpleAnnotation在哪里

 @Target(ElementType.METHOD) public @interface SimpleAnnotation { public String a(); public int b(); ) 

ComplexAnnotation

 @Target(ElementType.METHOD) public @interface ComplexAnnotation { public SimpleAnnotation[] value() default {}; ) 

取自以下网页的示例: https : //blogs.oracle.com/toddfast/entry/creating_nested_complex_java_annotations

注释的概念非常适合我的项目的devise,直到我意识到注释中不能有复杂的数据types。 我通过使用我想要实例化的类而不是该类的实例化对象来解决这个问题。 这不是完美的,但是Java很less。

 @interface Decorated { Class<? extends PropertyDecorator> decorator() } interface PropertyDecorator { String decorate(String value) } class TitleCaseDecorator implements PropertyDecorator { String decorate(String value) } class Person { @Decorated(decorator = TitleCaseDecorator.class) String name }