在 Java 中创建具有默认值的注释实例

2022-09-01 04:49:11

如何创建以下注释的实例(所有字段都设置为默认值)。

    @Retention( RetentionPolicy.RUNTIME )
    public @interface Settings {
            String a() default "AAA";
            String b() default "BBB";
            String c() default "CCC";
    }

我试过了,但这似乎不起作用...new Settings()


答案 1

要创建实例,您需要创建一个实现:

例如:public class MySettings implements Annotation, Settings

但是您需要特别注意界面的正确实现和依据。http://download.oracle.com/javase/1.5.0/docs/api/java/lang/annotation/Annotation.htmlequalshashCodeAnnotation

如果您不想一次又一次地实现它,那么请查看javax.enterprise.util.AnnotationLiteral类。这是CDI(Context Dependency Injection)-API的一部分。(@see代码)

要获取默认值,您可以使用 akuhn(以前称为:Adrian)描述的方式。Settings.class.getMethod("a").getDefaultValue()


答案 2

您无法创建实例,但至少可以获取默认值

Settings.class.getMethod("a").getDefaultValue()
Settings.class.getMethod("b").getDefaultValue()
Settings.class.getMethod("c").getDefaultValue()

然后,可以使用动态代理返回默认值。据我所知,这也是Java本身处理注释的方式。

class Defaults implements InvocationHandler {
  public static <A extends Annotation> A of(Class<A> annotation) {
    return (A) Proxy.newProxyInstance(annotation.getClassLoader(),
        new Class[] {annotation}, new Defaults());
  }
  public Object invoke(Object proxy, Method method, Object[] args)
      throws Throwable {
    return method.getDefaultValue();
  }
}

Settings s = Defaults.of(Settings.class);
System.out.printf("%s\n%s\n%s\n", s.a(), s.b(), s.c());

推荐