如何创build一个注释的实例
我正在尝试做一些Java注释魔术。 我必须说,我仍然赶上诠释技巧,而某些事情对我来说还不是很清楚。
所以…我有一些注释类,方法和领域。 我有一个方法,它使用reflection在类上运行一些检查,并将一些值注入到类中。 这一切工作正常。
不过,我现在正面临着一个需要一个注释的实例(这么说)的情况。 所以…注释不像常规的接口,你不能做一个类的匿名实现。 我知道了。 我在这里看过有关类似问题的一些post,但我似乎无法find我正在寻找的答案。
我基本上喜欢得到一个注解的实例,并能够使用reflection设置它的一些领域(我想)。 有没有办法做到这一点?
好吧,显然没有那么复杂。 真!
正如一位同事指出的那样,您可以简单地创build一个匿名的注释实例(就像任何接口一样):
MyAnnotation:
public @interface MyAnnotation { String foo(); }
调用代码:
class MyApp { MyAnnotation getInstanceOfAnnotation(final String foo) { MyAnnotation annotation = new MyAnnotation() { @Override public String foo() { return foo; } @Override public Class<? extends Annotation> annotationType() { return MyAnnotation.class; } }; return annotation; } }
学分马丁Grigorov 。
你可以使用一个注释代理,比如这个 ,或者这个来自Hibernate Validator项目(免责声明:我是后者的提交者)。
代理方式,正如Gunnar的答案所build议的,已经在GeAnTyRef中实现了:
Map<String, Object> annotationParameters = new HashMap<>(); annotationParameters.put("name", "someName"); MyAnnotation myAnnotation = TypeFactory.annotation(MyAnnotation.class, annotationParameters);
这将产生一个相当于您从中得到的注释:
@MyAnnotation(name = "someName")
通常以这种方式生成的注释实例的行为与Java生成的相同,并且为了兼容性,它们的hashCode
和equals
已经被正确实现。
图书馆本身很小,没有依赖关系。
披露:我是GeAnTyRef的开发者。
你可以使用sun.reflect.annotation.AnnotationParser.annotationForMap(Class, Map)
:
public @interface MyAnnotation { String foo(); } public class MyApp { public MyAnnotation getInstanceOfAnnotation(final String foo) { MyAnnotation annotation = AnnotationParser.annotationForMap( MyAnnotation.class, Collections.singletonMap("foo", "myFooResult")); } }
下行:来自sun.*
类在以后的版本中可能会发生变化(所有这些方法都存在于Java 5之后,具有相同的签名),并不适用于所有Java实现,请参阅此讨论 。
如果这是一个问题:您可以使用您自己的InvocationHandler
创build一个通用代理 – 这正是AnnotationParser
在内部为您所做的。 或者你使用你自己的MyAnnotation
实现,如这里所定义的。 在这两种情况下,您都应该记住要实现annotationType()
, equals()
和hashCode()
因为结果是专门为java.lang.Annotation
。