【问题标题】:AspectJ: How to replace an existing annotationAspectJ:如何替换现有注释
【发布时间】:2010-11-05 13:22:03
【问题描述】:

使用 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) 替换它”

【问题讨论】:

    标签: java junit aop aspectj


    【解决方案1】:

    我是 AspectJ 项目负责人。在https://bugs.eclipse.org/bugs/show_bug.cgi?id=313026 下,我们正在研究如何将声明注解用于:

    • 扩充现有注释(为已有注释添加值)
    • 替换它们
    • 定义优先级(您的声明应该替换现有的内容吗?)

    我们也在研究一种删除注释的形式:

    声明@remove_from_method: int mymethod(): @ToBeRemoved;

    但你还不能这样做......

    【讨论】:

    • 感谢您的更新。我已经登录添加了一些对该错误的投票。我会喜欢这个功能。感觉创造一个变通办法是一个相当丑陋的过程。
    【解决方案2】:

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

    可以做的是在测试注解旁边注入您自己的自定义注解并编写一个自定义 JUnit Runner 类(与 @RunWith 注解绑定,您可以再次使用您的注解注入它)方面),它使您的自定义注释优先于@Test 注释。

    【讨论】:

    • 有趣的是,这正是我现在在办公桌上打开的同一本书。哈哈。我喜欢你用这个去哪里。我已经编写了一些 mixin,所以我对让类做完全不同的事情(比如扩展其他东西)感到有些自在。不过,您的建议存在一个问题:我的测试类已经使用了 @RunWith 注释。我想知道如果我让所有测试都扩展一个使用自定义 @RunWith 的父类,这是否可行,正如你提到的那样
    • 父类方法可以工作(@RunWith 标记为@Inherited),但如果子类包含注解,则子类注解胜过父注解。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-28
    • 1970-01-01
    • 2012-08-13
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多