为什么以下代码:
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");
};
除了这个例子在没有警告的情况下工作之外,我看不出任何区别......
答案 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
}