如何创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生成的相同,并且为了兼容性,它们的hashCodeequals已经被正确实现。

图书馆本身很小,没有依赖关系。

披露:我是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