使用AspectJ将一个注释转换为多个注释

我在我的JPA映射中发现了一种我希望编写的模式。 一个简单的例子如下:

@OneToMany(fetch=FetchType.EAGER) @Sort(type=SortType.NATURAL) private SortedSet items; 

我想创建一个名为SortedOneToMany的注释,我可以应用于上面的集合:

 public @interface SortedOneToMany { FetchType fetch() default EAGER; SortType sort() default NATURAL; Class comparator() default void.class; } 

我写了以下方面,以便在看到我的注释时“附加”JPA注释:

 public aspect SortedOneToManyAspect { declare @field: @SortedOneToMany * * : @OneToMany(fetch=FetchType.EAGER); declare @field: @SortedOneToMany * * : @Sort(type=SortType.NATURAL); } 

但我不知道如何访问SortedOneToMany注释参数的值,并在定义OneToMany和Sort注释时使用它们。 在某些情况下,我可能会更改其中一个默认值,如下所示:

 @SortedOneToMany(sort=SortType.COMPARATOR,comparator=ItemComparator.class) private SortedSet items; 

那么如何将SortedOneToMany中的注释值传递给Sort注释呢?

我在Aspectj-users邮件列表上收到了Andy Clement的回答:

嗨,

我担心你现在不能用AspectJ做到这一点,你不能将一段匹配的信息传递给新的注释。 我或许可以想象一些假设的语法:

声明@field:@SortedOneToMany(sort = SortType.COMPARATOR,comparator = {1})* *:@Sort(type = SortType.COMPARATOR,comparator = {1});

这似乎达到了你想要的。

也许提出一个增强请求: https : //bugs.eclipse.org/bugs/enter_bug.cgi?product = AspectJ

对不起,我没有更好的消息。

欢呼安迪

我为这个问题创建了一张票,以防有人想跟踪进度: https : //bugs.eclipse.org/bugs/show_bug.cgi?id = 345515