如何创建以下注释的实例(所有字段都设置为其默认值).
@Retention( RetentionPolicy.RUNTIME ) public @interface Settings { String a() default "AAA"; String b() default "BBB"; String c() default "CCC"; }
我试过了new Settings()
,但这似乎不起作用......
要创建实例,您需要创建一个实现以下的类:
java.lang.annotation.Annotation
和你想要"模拟"的注释
例如:
public class MySettings implements Annotation, Settings
但是你需要特别注意正确的实现equals
和hashCode
根据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()
您无法创建实例,但至少可以获取默认值
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());
我编译并在下面运行,结果令人满意.
class GetSettings { public static void main (String[] args){ @Settings final class c { } Settings settings = c.class.getAnnotation(Settings.class); System.out.println(settings.aaa()); } }