2009-10-12 10 views
15

अक्सर मैं कोई स्रोत के साथ एक जावा वर्ग फ़ाइल के साथ अटक कर रहा हूँ और मैं इस समस्या मैं हाथ में है समझने की कोशिश कर रहा हूँ।समझौता जावा बाइट कोड

नोट एक decompiler उपयोगी है, लेकिन सभी की स्थिति में पर्याप्त नहीं है ...

मैं दो प्रश्न

  1. उपकरण क्या जावा बाइट कोड (linux कमांड लाइन से बेहतर उपलब्ध है) को देखने के लिए उपलब्ध हैं
  2. क्या अच्छा संदर्भ जावा बाईटकोड पर सीधे देख से

उत्तर

16

बल्कि जावा बाइट कोड वाक्य रचना से परिचित कराने के, जो कर रहे हैं w बीमार को जावा वर्चुअल मशीन और इसके संचालन के साथ परिचितता की आवश्यकता होती है, कोई जावा डीकंपलिंग उपयोगिता का उपयोग करने का प्रयास कर सकता है। एक decompiler निर्दिष्ट class फ़ाइल से एक java स्रोत फ़ाइल बनाने के लिए प्रयास करेंगे।

How do I “decompile” Java class files? एक संबंधित प्रश्न है जो जावा class फ़ाइलों को डीकंपाइल करने के तरीके के बारे में जानकारीपूर्ण होगा।

उस ने कहा, कोई javap कमांड का उपयोग कर सकता है जो जावा class फ़ाइलों को अलग करने के लिए जेडीके का हिस्सा है। javap का आउटपुट class फ़ाइलों में निहित जावा बाइटकोड होगा। लेकिन चेतावनी दीजिये कि बाइटकोड जावा स्रोत कोड जैसा दिखता नहीं है।

जावा बाईटकोड और जावा वर्चुअल मशीन ही The Java Virtual Machine Specification, Second Edition होगा के बारे में सीखने के लिए निश्चित स्रोत। विशेष रूप से, Chapter 6: The Java Virtual Machine Instruction Set में सभी बाइटकोड निर्देशों की एक अनुक्रमणिका है।

+0

decompiler, – hhafez

+0

@hhafez के बारे में मेरी टिप्पणी देखें: मुझे लगता है कि आप "जावा बाइट कोड को समझना" का उत्तर दिया गया है, है ना? –

1

आप एक वर्ग और कोई स्रोत कोड है, लेकिन आप एक बग है, तो आप दो बुनियादी चीजों में से एक कर सकते हैं:

  1. डिकंपाइल, बग को ठीक और जार फ़ाइल से तैयार करें। मैंने पहले यह किया है, लेकिन sysadmins उत्पादन में डाल के बारे में leery हैं।
  2. वर्ग के लिए लिखें इकाई परीक्षण, निर्धारित बग का कारण बनता है, इकाई परीक्षण के साथ बग रिपोर्ट और यह तय किया की प्रतीक्षा करें।

    (2) आम तौर पर एक है कि sysadmins, मेरे अनुभव में, पसंद करते हैं है।

    यदि आप (2) के साथ जाते हैं, तो इस बीच, जब आप जानते हैं कि बग का कारण क्या है, तो आप या तो समस्या को रोकने के लिए उस इनपुट को कक्षा में जाने की अनुमति नहीं दे सकते हैं, या इसे ठीक से संभालने के लिए तैयार नहीं हो सकते हैं जब त्रुटि होती है।

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

    आप बाईटकोड निर्देश पढ़ना सीखने, तो आप समस्या को हल करने के लिए क्या करेंगे?

+0

1. मुझे नहीं पता था कि आप .class में कोड डालने के लिए AspectJ का उपयोग कर सकते हैं, मैंने सोचा कि यह जावा पर काम करता है, लेकिन मुझे लगता है कि मैं गलत हूं 2. समस्या का पता लगाने पर मैं क्या करूँगा? कई बार यह पता लगाना कि आपकी समस्या को हल करने के लिए वास्तव में समस्या क्या है – hhafez

+0

@ हफेज़ - आप कक्षाओं में पहलुओं के रनटाइम बुनाई कर सकते हैं, लेकिन, जब आप ऐसा करते हैं तो लाइसेंस का उल्लंघन कर सकते हैं, तो बस थोड़ा सावधान रहें। यूनिट परीक्षण आपकी सबसे अच्छी शर्त हो सकती है, लेकिन यदि कोड टेस्ट करने योग्य नहीं है तो डिकंपलिंग एक विकल्प बन जाता है, लेकिन यह एक धीमी प्रक्रिया है, आईएमओ। –

0

मैं दो प्रश्न

1) क्या उपकरण (साथ linux कमांड लाइन से जावा बाइट कोड (अधिमानतः उपलब्ध )

javap उपकरण देखने के लिए उपलब्ध हैं -सी विकल्प) एक बाइटकोड फ़ाइल को अलग करेगा। यह कमांड लाइन से चलता है, और जावा एसडीके के हिस्से के रूप में आपूर्ति की जाती है।

2) क्या अच्छा संदर्भ जावा बाइट कोड वाक्य रचना से परिचित कराने के लिए कर रहे हैं

javap उपकरण के रूप में JVM विनिर्देश में प्रयोग किया जाता है एक ही सिंटैक्स का उपयोग करता है, और JVM कल्पना स्वाभाविक रूप से निश्चित स्रोत है । मैंने बिल वेनेर्स द्वारा "जावा वर्चुअल मशीन के अंदर" भी देखा। मैंने इसे कभी नहीं पढ़ा है, और ऐसा लगता है कि यह प्रिंट से बाहर हो सकता है।

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

14

कक्षा फ़ाइलों के बाइटकोड निर्देश देखने के लिए, javap -v कमांड का उपयोग करें, वैसे ही जैसे आप जावा प्रोग्राम चलाते हैं, क्लासपाथ (यदि आवश्यक हो) और कक्षा का नाम निर्दिष्ट करते हैं।

उदाहरण:

javap -v com.company.package.MainClass 

बारे बाईटकोड अनुदेश सेट, Instruction Set Summary

+1

यह उत्तर मूल प्रश्न के दोनों पहलुओं को पूरी तरह से कवर करता है। – CyberMJ

2

Fernflower, एक विश्लेषणात्मक decompiler है, इसलिए यह bytecodes बजाय एक पठनीय जावा कोड के लिए कक्षाएं डिकंपाइल होगा। जब आप समझना चाहते हैं कि कोड कैसे काम करता है तो यह अधिक उपयोगी होता है।

0

आप ग्रहण बाइट कोड को रेखांकित उपयोगी प्लगइन मिल सकती है:

http://andrei.gmxhome.de/bytecode/index.html

मैं इसे अपने आप उपयोग नहीं किया है - बस गुजर में उल्लेख देखा।

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