如何创建注解实例

新手上路,请多包涵

我正在尝试做一些 Java 注释魔术。我必须说我仍在学习注释技巧,某些事情对我来说仍然不是很清楚。

所以…我有一些带注释的类、方法和字段。我有一个方法,它使用反射对类运行一些检查并将一些值注入到类中。这一切都很好。

但是,我现在面临的情况是我需要一个注释实例(可以这么说)。所以…注释不像常规接口,您不能对类进行匿名实现。我得到它。我在这里查看了一些关于类似问题的帖子,但我似乎无法找到我正在寻找的答案。

我基本上想获取注释的实例,并能够使用反射设置其中的一些字段(我想)。有没有办法做到这一点?

原文由 carlspring 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 546
2 个回答

好吧,这显然没有那么复杂。 真的!

正如一位同事所指出的,您可以像这样简单地创建一个注释的匿名实例(就像任何接口一样):

我的注释:

 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;
    }
}

感谢 Martin Grigorov

原文由 carlspring 发布,翻译遵循 CC BY-SA 3.0 许可协议

正如 Gunnar 的回答 中所建议的那样,代理方法已经在 GeantyRef 中实现:

 Map<String, Object> annotationParameters = new HashMap<>();
annotationParameters.put("name", "someName");
MyAnnotation myAnnotation = TypeFactory.annotation(MyAnnotation.class, annotationParameters);

这将产生一个等同于您从中获得的注释:

 @MyAnnotation(name = "someName")

以这种方式生成的注解实例将与 Java 通常生成的注解实例相同,并且它们的 hashCodeequals 已正确实现以实现兼容性,因此没有像直接实例化注解那样的奇怪警告就像在接受的答案中一样。事实上,JDK 内部使用相同的方法: sun.reflect.annotation.AnnotationParser#annotationForMap

该库本身很小并且没有依赖项(并且不依赖于 JDK 内部 API)。

披露: 我是 GeantyRef 背后的开发者。

原文由 kaqqao 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题