6

为什么下面的代码:

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

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

生成以下警告:

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

我正在使用 Eclipse。我安装了eclipse aspectj 插件,当然我的项目是一个 aspectj 项目。

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

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

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

4

2 回答 2

3

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

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

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

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

于 2010-11-04T19:23:43.617 回答
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
}
于 2010-11-04T13:39:01.507 回答