繁体   English   中英

Java注释 - 如何创建数组?

[英]Java Annotations - how to create an array?

我尝试使用嵌套的JAVA注释创建“地图”。

public @interface EnvInstance {
    Env env();
    Instance instance();
}

public @interface Configuration {
    String description();
    EnvInstance[] envInstances() default {};
}

@Configuration(description = "Test", envInstances = {
    @EnvInstance(env = Env.CERT, instance = Instance.FIRST),
    @EnvInstance(env = Env.INTEGR, instance = Instance.SECOND),
    @EnvInstance(env = Env.PROD, instance = Instance.FIRST),
    ...
}
)
public class TestObject {

}

它似乎有效,但有一件事我不知道如何实现。 我想创建两个默认的envInstances配置集,所以我可以输入:

@Configuration(description = "Test", envInstances = SET_ONE)
public class TestObject {
}

要么

@Configuration(description = "Test", envInstances = SET_TWO)
public class TestObject {
}

是否有可能创建内部注释的静态数组或类似的东西并将其传递给外部注释?

我担心没有办法提取这种重复。

您不能从常量向注释提供数组值( 阅读更多 )。 也无法创建扩展另一个注释的注释( 阅读更多 )。

我不知道上下文,但您是否考虑将此信息传递到对象本身,并将其存储为字段,而不是通过注释?

可能有效的另一个可能的解决方案是使这些类实现标记接口并改为注释接口。 但注释不是继承的。 如果您可以修改解析器(或者正在阅读注释的任何内容),您可以执行以下操作:

@Retention(RetentionPolicy.RUNTIME)
public @interface X {
    String[] value();
}

@X({"a", "b", "c"})
interface AnInterface {}

public static class TestClass implements AnInterface {}

public static void main(String[] args) {
    // annotations are not inherited, empty array
    System.out.println(Arrays.toString(TestClass.class.getAnnotations()));

    // check if TestClass is annotated with X and get X.value()
    Arrays.stream(TestClass.class.getAnnotatedInterfaces())
            .filter(type -> type.getType().equals(AnInterface.class))
            .map(type -> (Class<AnInterface>) type.getType())
            .findFirst()
            .ifPresent(anInterface -> {
                String[] value = anInterface.getAnnotation(X.class).value();
                System.out.println(Arrays.toString(value));
            });
}

是否有可能创建内部注释的静态数组或类似的东西并将其传递给外部注释?

对于原始或字符串值的注释元素,您可以在其他地方声明static final常量,并在注释中引用它,但这对于数组值元素不起作用。

Java语言规范第9.7.1节规定,对于不以语法开头的数组值注释元素指定的任何值必须被视为单元素数组的简写,即解析器处理

@Configuration(description = "Dupa", envInstances = SET_ONE)

好像它说的那样

@Configuration(description = "Dupa", envInstances = {SET_ONE})

因为你试图将envInstances设置为EnvInstance[][]而不是EnvInstance[]EnvInstance[]


准确的措辞(我在适用于本案的章节中加粗):

如果元素类型与元素值不相称,则为编译时错误。 当且仅当下列之一为真时,元素类型T与元素值V相称:

  • T是一个数组类型E[] ,并且:
    • 如果V是ConditionalExpression或Annotation,则VE相称 ; 要么
    • 如果V是ElementValueArrayInitializer,则V包含的每个元素值与E相当。

[剪断]

  • T不是数组类型, V的类型与T分配兼容(第5.2节),并且:
    • 如果T是基本类型或String ,则V是常量表达式(第15.28节)。

[剪断]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM