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
但是你需要特别注意正确的实现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()
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)