【问题标题】:Why I got "advice has not been applied" warning?为什么我收到“建议尚未应用”警告?
【发布时间】:2010-11-04 13:34:12
【问题描述】:

为什么会出现以下代码:

 pointcut callsToList() : call(* List.*(..));

 before(List l) : callsToList() && target(l) {
  System.out.println("cool");
 }

生成以下警告:

建议定义在 org.eclipse.ajdt.examples.ListAdvice 尚未应用 [Xlint:adviceDidNotMatch]

我正在使用 Eclipse。我安装了eclipse aspectj plugin,当然我的项目是aspectj项目。

编辑:此外,我从 ajdt 插件提供的工作示例开始:

pointcut callsToBeginTask() : call(void IProgressMonitor.beginTask(..)); 
before() : callsToBeginTask() {
     System.out.println("cool");
};

我看不出有什么不同,除了这个例子没有警告就可以工作......

【问题讨论】:

  • 也许这与 Eclipse/OSgi 类加载策略有关?为了挂钩提供的切入点,aspectj 是如何工作的?
  • 你能展示应该由建议编织的代码吗?
  • 不确定是否理解您的请求。我希望在运行多个自定义插件的 Eclipse 应用程序中调用此建议。因此,我要“分析”的代码被分成许多插件/包/类。

标签: java aop aspectj ajdt


【解决方案1】:

当您希望 AspectJ 在 OSGi 环境中工作时,您必须使用 Equinox Aspects(又名 Equinox Weaving)。这是一种适用于 osgi 类加载器的加载时间编织形式。

本教程有点过时,但应该可以帮助您入门:

http://www.eclipse.org/equinox/incubator/aspects/equinox-aspects-quick-start.php

当您的方面都针对同一个项目时,您不需要 Equinox Aspects。常规编译时编织可以,但要跨越多个包/插件,这将不起作用。

【讨论】:

    【解决方案2】:

    我的猜测是,因为 List 是一个接口,并且您想匹配对所有扩展类的调用,您必须使用以下语法:

    pointcut callsToList() : call(* List+.*(..));
    

    更新:好的,我让它与这个版本一起工作:

    pointcut callsToList(List list) :
        call(* java.util.List+.*(..)) && target(list);
    
    Object around(List l) : callsToList(l) {
        // code here
    }
    

    这也有效:

    before(List l) : callsToList(l) {
        // code here
    }
    

    【讨论】:

    • 您的回答不能解决我的问题。此外,我从 ajdt 插件提供的一个工作示例开始:切入点 callToBeginTask() : call(void IProgressMonitor.beginTask(..)); before() : 调用ToBeginTask() {};
    • 即使 IProgressMonitor 是一个接口,这个例子也不会产生任何警告。
    • 查看我的更新答案,这对我有用。关于progressmonitor的东西:如果你想回答,请把它放在你的问题(或单独的问题)中。
    • 所以我猜你复制了和我一样的问题?你知道为什么我们需要使用 around 吗?根据 aspectj 的文档,它以前应该可以使用,不是吗?非常感谢您的帮助。
    • 我遇到了各种奇怪的问题,但现在可以了,以前也可以(请参阅我的更新)
    猜你喜欢
    • 2013-03-25
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    相关资源
    最近更新 更多