मेरे पास जावा 6 प्रोजेक्ट है जिसे जावा 8 में माइग्रेट किया जा रहा है। हमने बटन क्लिक करने जैसे कुछ उपयोगकर्ताओं के कार्यों को लॉग इन करने के लिए aspectj का उपयोग किया।Aspectj: लैम्बडा अभिव्यक्ति पर पॉइंटकट
button.addClickListener(new Button.ClickListener() {
@Override
public void buttonClick(Button.ClickEvent clickEvent) {
doSth();
}
});
और poincut:
तो वहाँ इस तरह श्रोताओं हैं
@Pointcut("execution(public void Button.ClickListener.buttonClick(Button.ClickEvent))")
public void buttonClick() {};
लेकिन चूंकि हम Java8 का उपयोग करेगा, श्रोताओं इस तरह होगा:
button.addClickListener(clickEvent -> doSth());
वहाँ है पहलू पॉइंटकट लिखने का कोई तरीका, ताकि यह नए श्रोताओं को संभाल सके?
मुझे लगता है कि आपका 'पॉइंटकट' अभी भी काम कर रहा है क्योंकि आपने 'लम्बाडा' और 'बटन' का उपयोग करने के लिए 'addClickListener' को संशोधित किया है। क्लिक करें। क्लिक करें। बटन पर क्लिक करें' अभी भी रैमैन समान है। क्या आपने इसे भी संशोधित किया? –
यह निश्चित रूप से काम नहीं कर रहा है। मैंने केवल लैम्ब्डा का उपयोग करने के लिए addClickListener को संशोधित किया। हां, यह अभी भी बटन का उपयोग करता है .ClickListener.button क्लिक करें लेकिन फ़ंक्शन को पॉइंटकट से पहले निष्पादित किया जाना चाहिए (जैसा कि: @Before ("बटनक्लिक()") कभी नहीं कहा जाता है। इसे गैर-लैम्ब्डा परिभाषा का उपयोग करने पर कहा जाता है। – Lete
तो इसका तात्पर्य है कि AspectJ रनटाइम पर 'LambdaMetaFactory' द्वारा उत्पन्न श्रोता वर्ग के तरीकों को पैच करने में सक्षम नहीं है। लेकिन क्या यह' इंटरफ़ेस 'के' डिफ़ॉल्ट 'विधियों को संशोधित कर सकता है? इससे संभावित समाधान हो सकता है ... – Holger