2010-11-05 42 views
1

使用AspectJ,如何替换现有注释?AspectJ:如何替换现有注释

我有以下代码

declare @method : @Test * *(..) : @Test(timeout=10); 

这对每个测试方法生成以下错误:

... already has an annotation of type org.junit.Test, cannot add a second 
instance [Xlint:elementAlreadyAnnotated] 

当然,错误是有道理的,但什么是说,语法“中删除@Test注释有所有的方法,然后用@Test(timeout=10)

回答

4

我是AspectJ项目负责人。在https://bugs.eclipse.org/bugs/show_bug.cgi?id=313026我们正在研究如何使用申报注释:

  • 加强现有的注解(增加值,那些已经存在)
  • 替换它们
  • 定义优先级(应您的声明取代还有什么?)

我们也在寻找它的形式,消除注释:

声明@remove_from_method:INT的MyMethod() : @即将被删除;

但你不能做到这一点尚未...

+0

感谢您的更新。我已经登录添加了一些关于这个bug的投票。我很喜欢这个功能。感觉创建一个解决方法是一个相当难看的过程。 – gMale 2010-12-20 01:44:58

1

我怀疑你可以用Aspe CTJ。至少我在当前版本的AspectJ in Action中找不到任何相关信息。

什么你可以做的是旁边的测试注解注入自己的自定义注释和编写自定义的JUnit Runner类(与@RunWith注释,您可以再次与您方面注入约束),让您的自定义注解优先通过@Test注释。

+0

搞笑,这就是同一本书我有我的办公桌上开放,现在。大声笑。我喜欢你要去的地方。我已经写了一些mixin,所以我对使类完成不同的事情(比如扩展其他东西)感到有点舒服。尽管你的建议有一个问题:我的测试类已经使用了@RunWith注解。我想知道如果我做所有测试扩展一个使用自定义@RunWith的父类,如果这可以工作,正如你所提到的 – gMale 2010-11-05 14:02:47

+0

父类方法将工作('@ RunWith'标记为'@ Inherited'),但如果孩子类包含注释,子注释胜过父注释。 – 2010-11-05 14:09:32