2010-11-04 11 views
6

क्यों निम्नलिखित कोड है:मुझे "सलाह लागू नहीं की गई" चेतावनी क्यों मिली?

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

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

निम्न चेतावनी उत्पन्न करता है:

सलाह org.eclipse.ajdt.examples.ListAdvice में परिभाषित किया गया लागू नहीं हुआ है [Xlint: adviceDidNotMatch]

मैं ग्रहण में काम कर रहा हूं। मैंने eclipse aspectj plugin स्थापित किया और निश्चित रूप से मेरी परियोजना एक पहलू परियोजना है।

संपादित करें: इसके अलावा मैं ajdt प्लगइन द्वारा प्रदान की एक काम उदाहरण से शुरू:

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

मैं तथ्य यह है कि इस उदाहरण बिना किसी चेतावनी के काम करता है सिवाय कोई अंतर नहीं देख सकता ...

+0

शायद यह ग्रहण/ओएसजीआई कक्षा लोडिंग नीति से संबंधित है? प्रदान किए गए पॉइंटकट्स को हुक करने के लिए पहलू कैसे काम करता है? –

+0

क्या आप कोड दिखा सकते हैं जिसे सलाह से बुनाया जाना चाहिए? – Espen

+0

आपके अनुरोध को समझना सुनिश्चित नहीं है। मैं इस सलाह को एक ग्रहण अनुप्रयोग में कई कस्टम प्लगइन चलाने के लिए बुलाया जाना चाहता हूं। इस प्रकार मैं जिस कोड को "विश्लेषण" करना चाहता हूं उसे कई प्लगइन/पैकेज/कक्षाओं में विभाजित किया गया है। –

उत्तर

3

जब आप AspectJ एक OSGi वातावरण में काम करना चाहते हैं, तो आप विषुव पहलुओं (उर्फ विषुव बुनाई) का उपयोग करना चाहिए। यह लोड टाइम बुनाई का एक रूप है जो ओजीआई क्लासलोडर्स के साथ काम करता है।

इस ट्यूटोरियल पुराने हो चुके एक छोटे से है, लेकिन आप शुरू कर दिया जाना चाहिए:

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

जब आपके पहलुओं सभी एक ही परियोजना के भीतर लक्षित कर रहे हैं, तो आप विषुव पहलुओं जरूरत नहीं है। नियमित संकलन समय बुनाई करेगा, लेकिन कई बंडल/प्लगइन फैलाने के लिए, यह काम नहीं करेगा।

2

मेरा अनुमान

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

आपका उत्तर मेरी समस्या का समाधान नहीं करता है। इसके अलावा मैंने एजेडीटी प्लगइन द्वारा प्रदान किए गए एक कामकाजी उदाहरण से शुरू किया: \t पॉइंटकट कॉल टोबीजिन टास्क(): कॉल (शून्य IProgressMonitor.beginTask (..)); \t \t पहले(): callToBeginTask() {}; –

+0

यह उदाहरण किसी भी चेतावनी उत्पन्न नहीं करता है भले ही IProgressMonitor एक इंटरफ़ेस है। –

+0

मेरा अद्यतन उत्तर देखें, यह मेरे लिए काम करता है। प्रगति मॉनिटर सामग्री के बारे में: कृपया इसे अपने प्रश्न (या एक अलग प्रश्न) में रखें यदि आप इसका उत्तर देना चाहते हैं। –