मैं एक गेम इंजन/लाइब्रेरी लिख रहा हूं जिसमें मेरे पास एक ईवेंट प्रेषक वर्ग है जो "पंजीकृत" ईवेंट हैंडलर कक्षाओं के श्रोता विधियों को कॉल करके ईवेंट भेजता है। कोई उचित प्रेषक विधि को कॉल करके इवेंट हैंडलर/श्रोता को ईवेंट प्रेषक के साथ पंजीकृत कर सकता है।जावा क्लास w/इंस्ट्रुमेंटेशन में कोड जोड़ना: एएसएम या बीसीईएल?
यह स्पष्ट रूप से प्रत्येक ईवेंट हैंडलर (और मेरे इंजन के अन्य पहलुओं के समान बॉलीएरप्लेट कोड) के पंजीकरण के लिए कुछ बॉयलरप्लेट कोड की ओर जाता है, इसलिए मैं सोच रहा था - लोडिंग के दौरान सभी आवश्यक कोड में जोड़ने के लिए इंस्ट्रुमेंटेशन का उपयोग कैसे करें इवेंट हैंडलर क्लास का, ताकि कोड प्रेषण के दौरान ईवेंट प्रेषक के साथ कोई स्पष्ट पंजीकरण आवश्यक न हो - प्रोग्राम चलाए जाने पर प्रेषक की पंजीकरण विधि को कॉल स्वचालित रूप से जोड़ा जाता है।
यह मेरी समझ है कि इंस्ट्रुमेंटेशन का उपयोग करने के लिए किसी को कुछ बाइटकोड संशोधक एपीआई का उपयोग करना चाहिए। मैं दो - एएसएम और बीसीईएल के बारे में जानता हूं। मुझे किसका उपयोग करना चाहिए? जाहिर है, यह एक साधारण काम है जिसे मैं करने की कोशिश कर रहा हूं, इसलिए मैं वह सीखना चाहता हूं जो सीखना आसान और बेहतर दस्तावेज हो।
संपादित करें: यहां एक विशिष्ट उदाहरण है।
मूल ईवेंट हैंडलर वर्ग:
@Handler //indicates this this class should be transformed
public class MouseEventHandler implements EventHandler<MouseEvent>
{
//hidden default constructor
public void handleEvent(MouseEvent event)
{ ... }
}
परिवर्तन के बाद:
@Handler
public class MouseEventHandler implements EventHandler<MouseEvent>
{
public MouseEventHandler()
{
//add this line of code to default constructor
Game.getEventDispatcher().addEventHandler(this);
}
public void handleEvent(MouseEvent event)
{ ... }
}
बीएसएल को जेडीके –
@ alexander.box में शामिल किया गया है: हाँ, एक्सएसएलटीसी ट्रांसफॉर्मर ज़लान की निर्भरता के रूप में, लेकिन यह गैर मानक API है और पैकेज com.sun.org.apache.bcel.internal में भी छिपा हुआ है ! बेहतर अपने जार प्रदान करें। – Daniel
ओह, और जब मैं इसमें हूं: कक्षाओं का वाद्य यंत्र होने पर एएसएम बहुत अच्छा विकल्प है। समझने और उपयोग करने में आसान है। इसके अलावा यह एक बहुत अच्छा दस्तावेज है। – Daniel