【问题标题】:Annotation parameter - String[] type parameter set to string literal注释参数 - String[] 类型参数设置为字符串字面量
【发布时间】:2025-12-05 04:35:01
【问题描述】:

了解How to set String Array in Java Annotation

我有一个查询,下面的代码:

@Unfinished("Just articleware")
public @interface Unfinished {
    public enum Priority {LOW, MEDIUM, HIGH}
    String value();
    String[] owners() default "";
    Priority priority() default Priority.MEDIUM;
}

期待语法String[] owners() default {}。 Java编译器如何允许String[]类型参数(owners)的字符串文字语法("")?

【问题讨论】:

  • 两个版本都可以接受。 default ""default {""} 类似,因此默认值为带有 one 元素的数组:空字符串。如果您设置default {},则默认值为 empty 数组。
  • 具有空字符串的数组。您也可以在其中放置一个字符串“default”,或者将{} 放在一个空数组中。

标签: java annotations variadic-functions


【解决方案1】:

正如在 cmets 中所标记的那样,注释键 owners 的默认值 "" 创建了一个包含空字符串元素的数组。您也可以在其中放置一个字符串"default",这将导致创建一个只有“默认”值的数组

{} 如果需要,仅用于空数组。


要对此进行测试,您可以将带有运行时保留策略的注释标记为:

@Unfinished("Just articleware")
@Retention(RetentionPolicy.RUNTIME) // mark with Runtime retention policy
public @interface Unfinished {
    enum Priority {LOW, MEDIUM, HIGH}

    String value();

    String[] owners() default "";

    Priority priority() default Priority.MEDIUM;
}

用这个注释一个类

@Unfinished(value = "")
public class AnnotatedClass {

    public static void main(String[] args) {
        System.out.println("");
    }
}

然后使用Reflection获取Unfinished的key的值为:

public static void main(String[] args) throws Exception {
    System.out.println("Testing...");
    Class<AnnotatedClass> obj = AnnotatedClass.class;
    if (obj.isAnnotationPresent(Unfinished.class)) {
        Annotation annotation = obj.getAnnotation(Unfinished.class);
        Unfinished unfinished = (Unfinished) annotation;
        System.out.println(Arrays.toString(unfinished.owners()));
    }
}

【讨论】: