2010-11-04 65 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

相關問題