当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在Java中使用默认值创建Annotation实例》经验,为你挑选了3个好方法。

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

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

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



1> Ralph..:

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

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()



2> akuhn..:

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

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

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

class Defaults implements InvocationHandler {
  public static  A of(Class 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());



3> emory..:

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

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

推荐阅读
linjiabin43
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有