annotations java注释标签 - 哪些类型可以用于Java注释成员?





java注释@code javadoc是什么 (5)


注释的概念非常适合我的项目设计,直到我意识到注释中不能包含复杂的数据类型。 我通过使用我想要实例化的类而不是该类的实例化对象来解决这个问题。 这并不完美,但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
}

今天,我想创建我的第一个注释接口,按照这个文档 ,我得到了编译器错误“注释成员的无效类型”:

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

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

我发现使用试错法:

String -->有效

int -->有效

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

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

Object -->无效

也许有人可以对实际允许哪些类型以及原因进行说明。




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

例如:

@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示例: https://blogs.oracle.com/toddfast/entry/creating_nested_complex_java_annotationshttps://blogs.oracle.com/toddfast/entry/creating_nested_complex_java_annotations




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

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

这看起来有些限制,但毫无疑问,这是有原因的。

还要注意,多维数组(例如String[][] )被上述规则隐式禁止。




我同意Skaffman提供的类型。

其他限制:它必须是编译时常量

例如,以下是禁止的:

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



public static MyEnum getFromValue(String value) {
    MyEnum resp = null;
    MyEnum nodes[] = values();
    for(int i = 0; i < nodes.length; i++) {
        if(nodes[i].value.equals(value)) {
            resp = nodes[i];
            break;
        }
    }
    return resp;
}




java annotations