为什么我得到“建议尚未应用”的警告?

时间:2010-11-04 13:34:12

标签: java aop aspectj ajdt

为什么以下代码:

 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,当然我的项目是一个方面项目。

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

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

除了这个例子在没有警告的情况下工作之外,我看不出任何区别......

2 个答案:

答案 0 :(得分:3)

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

本教程有点过时,但应该让您入门:

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

如果您的方面都是同一项目中的目标,则不需要Equinox Aspects。定期编译时编织会做,但要跨越多个bundle / plugins,这将无效。

答案 1 :(得分: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
}