哪些类型可用于Java注释成员?

Dan*_*ski 219 java annotations

今天我想按照这个文档创建我的第一个注释界面,我得到了编译器错误

Invalid type for annotation member":
public @interface MyAnnotation {
    Object myParameter;
    ^^^^^^
}
Run Code Online (Sandbox Code Playgroud)

显然Object不能用作注释成员的类型.不幸的是,我找不到任何关于哪些类型可以使用的信息.

我发现这是使用反复试验:

  • String →有效
  • int →有效
  • Integer →无效(令人惊讶)
  • String[] →有效(令人惊讶)
  • Object →无效

也许某人可以了解实际允许哪些类型以及原因.

ska*_*man 299

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

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

它似乎有限制,但毫无疑问有理由.

另请注意,String[][]上述规则隐式禁止多维数组(例如).

  • 如何找到这些页面/文件?我发誓每次谷歌每次询问StackOverlow之前,在许多Java问题上有人发布了一个链接到JSL,它回答了我的问题.为什么我没有通过谷歌找到这些页面?! (30认同)
  • 上面列表中缺少的是"注释".您可以拥有一个包含另一个注释或另一个注释数组的注释. (13认同)
  • JLS对谷歌不友好.你只需要知道它就在那里. (10认同)
  • 请注意,这里的“Class”是指字面意思_java.lang.Class_类,而不是所有类。 (2认同)

KLE*_*KLE 58

我同意Skaffman的可用类型.

附加限制:它必须是编译时常量.

例如,禁止以下内容:

@MyAnnot("a" + myConstantStringMethod())
@MyAnnot(1 + myConstantIntMethod())
Run Code Online (Sandbox Code Playgroud)


fik*_*nik 26

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

例如:

@ComplexAnnotation({
    @SimpleAnnotation(a="...", b=3),
    @SimpleAnnotation(a="...", b=3),
    @SimpleAnnotation(a="...", b=3)
})
public Object foo() {...}
Run Code Online (Sandbox Code Playgroud)

这里SimpleAnnotation

@Target(ElementType.METHOD)
public @interface SimpleAnnotation {
    public String a();
    public int b();
)
Run Code Online (Sandbox Code Playgroud)

并且ComplexAnnotation

@Target(ElementType.METHOD)
public @interface ComplexAnnotation {
    public SimpleAnnotation[] value() default {};
)
Run Code Online (Sandbox Code Playgroud)

示例来自:https://blogs.oracle.com/toddfast/entry/creating_nested_complex_java_annotations

  • 使用Java 8` @ Repeatable`,不再需要它了. (4认同)

小智 11

注释的概念非常适合我的项目设计,直到我意识到注释中不能有复杂的数据类型.我通过使用我想要实例化的类而不是该类的实例化对象来解决它.它并不完美,但java很少.

@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
}
Run Code Online (Sandbox Code Playgroud)