Java注释 - 如何创建数组?

时间:2015-11-10 12:01:17

标签: java annotations

我尝试使用嵌套的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 {
}

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

2 个答案:

答案 0 :(得分:1)

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

您无法从常量(read more)向注记提供数组值。也无法创建扩展另一个注释(read more)的注释。

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

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

@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));
            });
}

答案 1 :(得分:1)

  

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

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

Java language specification section 9.7.1强制要求为语法以开头括号开头的数组值注释元素指定的任何值必须被视为单元素数组的简写,即解析器处理

@Configuration(description = "Dupa", envInstances = SET_ONE)
好像它说的那样

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

并失败,因为您尝试将envInstances设置为EnvInstance[][]而不是EnvInstance[]

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

  

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

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

[剪断]

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

[剪断]