当前位置: 首页 > 知识库问答 >
问题:

将注释属性传递给元注释

阳兴文
2023-03-14

假设我有一个带有属性的注释:

@Named(name = "Steve")
private Person person

我想创建一个包含多个元注释的复合注释,包括一个带有属性的注释

@Named
@AnotherAnnotation
@YetAnotherAnnotation
public @interface CompoundAnnotation {

    ...
}

有没有一种方法可以将复合注释的属性传递给其中一个元注释?

例如,类似这样的东西:

@CompoundAnnotation(name = "Bob")
private Person person;

这相当于,但比

@Named(name = "Bob")
@AnotherAnnotation
@YetAnotherAnnotation
private Person person;

谢谢!

PS为我对示例注释的错误选择表示歉意-我没有javax。注射@记住命名注释,只是一些具有属性的任意注释。

谢谢大家的回答/评论。

这显然是不可能的。然而,碰巧我的案例有一个简单的解决方法,我将与大家分享,以防它对任何人都有帮助:

我正在使用Spring,并希望创建自己的注释,其中@Component作为元注释,从而通过组件扫描自动检测。但是,我也希望能够设置BeanName属性(对应于@Component中的value属性),以便可以自定义bean名称。

事实证明,Spring上有思想的人使得这样做成为可能——注释BeanNameGenerator将获取传递的任何注释的“值”属性,并将其用作bean名称(当然,默认情况下,它只会传递注释为@Component或具有@Component作为元注释)。回想起来,这从一开始就对我来说是显而易见的——这就是使用@Component作为元注释的现有注释,如@Service和@注册表,可以提供bean名称的方式。

希望对某人有用。我仍然认为这是一个遗憾,这是不可能的更普遍的虽然!

共有2个答案

张翰音
2023-03-14

有没有一种方法可以将复合注释的属性传递给其中一个元注释?

我认为简单的答案是“不”。例如,没有办法询问Person上面有什么注释,并获得@Name

更复杂的答案是,可以链接注释,但必须通过反射来研究这些注释。例如,以下工作:

@Bar
public class Foo {
    public static void main(String[] args) {
        Annotation[] fooAnnotations = Foo.class.getAnnotations();
        assertEquals(1, fooAnnotations.length);
        for (Annotation annotation : fooAnnotations) {
            Annotation[] annotations =
                annotation.annotationType().getAnnotations();
            assertEquals(2, annotations.length);
            assertEquals(Baz.class, annotations[0].annotationType());
        }
    }

    @Baz
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Bar {
    }

    @Retention(RetentionPolicy.RUNTIME)
    public @interface Baz {
    }
}

但是,以下语句将返回null:

// this always returns null
Baz baz = Foo.class.getAnnotation(Baz.class)

这意味着任何正在寻找@Baz注释的第三方类都不会看到它。

戚京
2023-03-14

几年后的今天,由于您使用的是Spring,您现在要求的是使用@AliasFor注释。

例如:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@SpringApplicationConfiguration
@ActiveProfiles("test")
public @interface SpringContextTest {

    @AliasFor(annotation = SpringApplicationConfiguration.class, attribute = "classes")
    Class<?>[] value() default {};

    @AliasFor("value")
    Class<?>[] classes() default {};
}

现在,您可以使用@SpringContextTest(MyConfig.class)为您的测试添加注释,令人惊讶的是,它实际上按照您预期的方式工作。

 类似资料:
  • 我是uber Cadence的新手,尝试编写一个cron调度任务。Cadence提供了一个cron附表注释(在网上找个例子),它需要一个cron表达式字符串,用于在特定时间触发方法。但是,我想让这个cron表达式按照我们在yml文件中设置的来加载。有什么方法可以做到吗?我目前只找到了这个@cron附表注释的方法来做。我还发现有一个Workflow Option可以设置cron附表。但是,不知道如何

  • 我有接口资源和实现它的几个类,例如音频、视频...此外,我创建了带有类类型参数的自定义注释MyAnnoection: 在代码的其他地方,我必须使用接口资源作为返回类型: 问题是如何根据将返回的资源类型适当地注释注释@其他注释?

  • 我正在使用注释处理来生成一些类...我有两个模块,处理器本身和使用它的“客户端”模块。我想通过客户端向处理器传递一个参数,我可以这样做 如何在处理器端检索此参数?

  • 我试图向自定义注释中注入一个值,但Spring似乎没有进行评估。

  • 我是Spring Security的新手。我看过很多关于如何通过外部属性文件的注释注入值的文章。我尝试了很多方法,但最终都是用java。lang.IllegalArgumentException:无法解析占位符“val.id”异常。 你能给我一些提示如何处理这个例外吗? 我的java类如下所示: 我的属性文件名为val.properties,位于WEB-INF下,其内容为val.id=xyz 我将

  • 我有我的Jhipster配置/应用程序属性。java类设置和工作,但不清楚如何将属性值注入url的假客户端注释: 使用@Value在下面不起作用: 有什么想法吗?