2010-11-04 55 views
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 plugin,当然我的项目是一个aspectj项目。

编辑:另外我从AJDT插件提供了一个工作示例开始:

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

我看不到,除了这个例子作品,未经警告的事实有什么区别...

+0

也许这与Eclipse/OSgi类加载策略有关? aspectj如何工作以勾住所提供的切入点? – 2010-11-04 13:48:13

+0

你能展示应该由建议编织的代码吗? – Espen 2010-11-04 14:20:51

+0

不确定要了解您的请求。我希望在运行多个自定义插件的Eclipse应用程序中调用此建议。因此,我想要“分析”的代码被分解到许多插件/包/类中。 – 2010-11-04 14:27:32

回答

3

当你想AspectJ来在OSGi环境中工作,你必须使用春分方面(又名春分织造)。这是一种加载时间编织的形式,可以与osgi类加载器一起使用。

本教程是过时了一点,但应该让你开始:

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

当你的各方面都针对同一个项目中,你不需要春分方面。定期编译时织入,但跨越多个捆绑包/插件,这是行不通的。

2

我的猜测是因为名单是一个接口,你想匹配所有扩展类调用,你将不得不使用此语法:

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

更新:OK,我得到了它的这项工作版本:

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 
} 
+0

你的回答并不能解决我的问题。此外,我从一个由ajdt插件提供的工作示例开始:\t pointcut callsToBeginTask():call(void IProgressMonitor.beginTask(..)); \t \t before():callsToBeginTask(){}; – 2010-11-04 13:44:20

+0

即使IProgressMonitor是接口,此示例也不会生成任何警告。 – 2010-11-04 13:45:15

+0

看到我更新的答案,这对我有用。关于进度监视器的内容:如果你想要它的话,请把它放在你的问题中(或单独的问题)。 – 2010-11-04 14:27:46

相关问题