2008-10-02 21 views
12

मैं एक प्रोजेक्ट पर काम कर रहा हूं जहां हम जावा सेवा और अन्य विभिन्न भाषाओं में लिखे गए क्लाइंट के बीच बहुत से दूरस्थ ऑब्जेक्ट ट्रांसफर कर रहे हैं। हमारी वर्तमान बाधाओं को देखते हुए मैंने यह देखने का फैसला किया है कि मौजूदा जावा क्लास के आधार पर कोड उत्पन्न करने के लिए क्या होगा। असल में मुझे .class फ़ाइल (या उनमें से एक संग्रह) लेने के लिए बाइटकोड को सभी डेटा सदस्यों और शायद गेटर्स/सेटर निर्धारित करने के लिए पार्स करने की आवश्यकता है और फिर कुछ लिखें जो एक ही संरचना के साथ कक्षा बनाने के लिए एक अलग भाषा में कोड आउटपुट कर सकता है ।प्रोग्रामेटिक रूप से निरीक्षण करें। क्लास फाइलें

मैं जेएडी जैसे मानक डीकंपलर की तलाश नहीं कर रहा हूं। मुझे .class फ़ाइल लेने और अपने डेटा सदस्यों और विधियों का एक ऑब्जेक्ट मॉडल बनाने में सक्षम होना चाहिए। क्या यह वास्तव में संभव है?

उत्तर

12

मैंने बीसीईएल का उपयोग किया है और इसे वास्तव में काफी अजीब लगता है। ASM बहुत बेहतर है। यह आगंतुकों का बहुत व्यापक रूप से उपयोग करता है (जो थोड़ा उलझन में हो सकता है) और ऑब्जेक्ट मॉडल नहीं बनाता है। ऑब्जेक्ट मॉडल नहीं बनाना बोनस बन जाता है, क्योंकि आप जिस मॉडल को बनाना चाहते हैं, वह सभी डेटा की शाब्दिक व्याख्या की तरह दिखने की संभावना नहीं है।

+2

+1। बहुत अच्छा एपीआई। – skaffman

+1

वास्तव में, यदि आप एक चाहते हैं तो एएसएम एक ऑब्जेक्ट मॉडल प्रदान करता है। उनके पेड़ एपीआई देखें। –

+0

यहां सूचीबद्ध सभी विकल्पों का मूल्यांकन करने के बाद, एएसएम निश्चित रूप से क्लास फाइलों का निरीक्षण करने के लिए सबसे अच्छा IMHO है। मैं मानता हूं कि विज़िटर पैटर्न बीसीईएल मॉडल की तुलना में अधिक क्लीनर है। पारितोषिक के लिए धन्यवाद। –

1

मैंने बीसीईएल का अतीत में उपयोग किया है और इसका उपयोग करना बहुत आसान था। यह कुछ साल पहले था इसलिए अब कुछ बेहतर हो सकता है।

Apache Jakarta BCEL

+0

वाह, आप वास्तव में मुझे अपने प्रश्न का उत्तर देने के लिए मार देते हैं। यह मेरी डिफ़ॉल्ट पसंद थी, मैं एक प्रश्न पूछने जा रहा था और इसे स्वयं जवाब देता था और देखता था कि किसी और के पास कोई बेहतर विचार है या नहीं। धन्यवाद। बीसीईएल पर एएसएम के लिए –

0

मुझे लगता है कि javassist आप भी मदद कर सकता है।

http://www.jboss.org/javassist/

मैं इसे का उपयोग करने के जरूरत थी कभी नहीं किया है, लेकिन अगर आप इसे आजमाइए, तो आप हमें इसके बारे में अपनी टिप्पणी पता है चाहते हैं?

हालांकि मुझे लगता है कि यह क्लास निरीक्षण से बाइटकोड मैनिपुलेशन के लिए अधिक है।

1

आपके विवरण से, यह simple reflection जैसा लगता है पर्याप्त होगा। आप कक्षा की सभी स्थिर संरचनाओं को खोज सकते हैं, साथ ही किसी विशेष उदाहरण के फ़ील्ड तक पहुंच सकते हैं।

यदि आप विधि निर्देशों का अनुवाद करने की कोशिश कर रहे हैं तो मैं केवल बीसीईएल पर जाऊंगा। (और यदि आप यही करने की कोशिश कर रहे हैं, तो शुभकामनाएँ!)

+0

संभावित समाधान के दौरान प्रतिबिंब आदर्श से कम है। मैं एक मनमाने ढंग से .class फ़ाइल को इंगित करने और इसे deconstruct करने में सक्षम होना चाहता हूँ। अगर मैं प्रतिबिंब का उपयोग करना चाहता था तो मुझे इसके साथ काम करना शुरू करने से पहले कक्षा लोड करने के लिए क्लासलोडर प्राप्त करना होगा। –

1

JAD एक जावा डिकंपेलर है जो प्रोग्रामेटिक पहुंच की अनुमति नहीं देता है। यह अब आसानी से उपलब्ध नहीं है, और शायद जावा 7 बाइटकोड के साथ नई परियोजनाओं के लिए काम नहीं करेगा।

+0

जेएडी एक डिकंपेलर है, मुझे कुछ ऐसी चीज चाहिए जो प्रोग्रामेटिक रूप से काम करे। –

+0

एफवाईआई, यह लिंक मर चुका है ... – hichris123

+0

इस लिंक को फिक्स्ड किया गया, और अधिक टेक्स्ट जोड़ा गया। –

1

मुझे आश्चर्य है कि किसी ने भी ASM का उल्लेख नहीं किया है। यह सबसे अच्छा बाइटकोड लाइब्रेरी है जो आपका पैसा खरीद सकता है। अच्छा, ठीक है यह मुफ़्त है।

संबंधित मुद्दे