在Java中使用默认值创建Annotation实例

aku*_*uhn 34 java annotations instantiation

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

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

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

Ral*_*lph 39

要创建实例,您需要创建一个实现以下的类:

  • java.lang.annotation.Annotation
  • 和你想要"模拟"的注释

例如: public class MySettings implements Annotation, Settings

但是你需要特别注意正确的实现equalshashCode根据Annotation界面. http://download.oracle.com/javase/1,5.0/docs/api/java/lang/annotation/Annotation.html

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

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


aku*_*uhn 35

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

Settings.class.getMethod("a").getDefaultValue()
Settings.class.getMethod("b").getDefaultValue()
Settings.class.getMethod("c").getDefaultValue()
Run Code Online (Sandbox Code Playgroud)

然后,可以使用动态代理返回默认值.就我所知,这也是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());
Run Code Online (Sandbox Code Playgroud)


emo*_*ory 24

我编译并在下面运行,结果令人满意.

class GetSettings {
    public static void main (String[] args){
      @Settings final class c { }
      Settings settings = c.class.getAnnotation(Settings.class);
      System.out.println(settings.aaa());
    }
}
Run Code Online (Sandbox Code Playgroud)