मैं मानव-पठनीय तरीके से जावा .class फ़ाइलों को कैसे खोल सकता हूं?


111

मैं यह पता लगाने की कोशिश कर रहा हूं कि एक जावा एप्लेट की क्लास फाइल हुड के नीचे क्या कर रही है। नोटपैड या टेक्स्टपैड के साथ इसे खोलने पर सिर्फ gobbledy-gook का एक गुच्छा दिखाई देता है।

क्या इसे वापस पढ़ने योग्य प्रारूप में वापस लाने का कोई तरीका है ताकि मैं यह पता लगाने की कोशिश कर सकूं कि यह क्या कर रहा है?

  • पर्यावरण == विंडोज डब्ल्यू / वीएस 2008 स्थापित।

7
बस एक शब्दार्थ बात, क्या यह एक = दो नहीं होना चाहिए? == एक सवाल है जबकि = एक बयान है और आप अपने पर्यावरण के बारे में एक बयान दे रहे हैं।
इको

क्या आप इस प्रश्न को स्पष्ट कर सकते हैं? मेरा तात्कालिक विचार यह था कि आप वास्तविक बायोटेक पढ़ना चाहते थे, लेकिन ऐसा लगता है कि आप वास्तव में किसी और के कोड को डिकंपाइल करना चाहते हैं।
आउटलॉव प्रोग्रामर

12
@icco, = का अर्थ असाइनमेंट, == का मतलब समानता है। वह कह रहा है कि (पर्यावरण == विंडोज w / VS2008 स्थापित) सत्य है, पर्यावरण को विंडोज w / VS2008 स्थापित करने का आदेश नहीं दे रहा है। मनुष्य जो अपमानजनक और नीरस था।
Blorgbeard

7
रिकॉर्ड के लिए == समानता की घोषणा नहीं करता है; यह समानता का परीक्षण करता है। आप सही == असत्य लिख सकते हैं, और यह लगभग सार्थक है जैसा कि पर्यावरण == विंडोज डब्ल्यू / वीएस 2008 स्थापित है, अर्थात् बिल्कुल भी सार्थक नहीं है।
बर्कक्स

जवाबों:


208

jd-gui इस समय सबसे अच्छा डिकम्पॉइलर है। यह जावा में नए फीचर्स को संभाल सकता है, जैसे कि डस्टी JAD की तुलना में।


1
2020 तक यह उत्तर कितना पुराना है?
कोडिंग वॉम्बैट

जब तक लिंक कहीं जाती है, मुझे लगता है कि यह अच्छा है। मुझे नहीं पता होगा कि अब एक बेहतर जावा डिकंपाइलर है, क्योंकि मैंने बहुत पहले से जावा का उपयोग नहीं किया है।
डैरनव

77

अगर आपको बायटेकोड पढ़ने में कोई आपत्ति नहीं है, तो javap को ठीक काम करना चाहिए। यह मानक JDK स्थापना का हिस्सा है।

Usage: javap <options> <classes>...

where options include:
   -c                        Disassemble the code
   -classpath <pathlist>     Specify where to find user class files
   -extdirs <dirs>           Override location of installed extensions
   -help                     Print this usage message
   -J<flag>                  Pass <flag> directly to the runtime system
   -l                        Print line number and local variable tables
   -public                   Show only public classes and members
   -protected                Show protected/public classes and members
   -package                  Show package/protected/public classes
                             and members (default)
   -private                  Show all classes and members
   -s                        Print internal type signatures
   -bootclasspath <pathlist> Override location of class files loaded
                             by the bootstrap class loader
   -verbose                  Print stack size, number of locals and args for methods
                             If verifying, print reasons for failure

9

जैसा कि @MichaelMyers द्वारा बताया गया है, उपयोग करें

javap -c <name of java class file> 

जेवीएम विधानसभा कोड प्राप्त करने के लिए। बेहतर दृश्यता के लिए आप आउटपुट को टेक्स्ट फ़ाइल पर पुनर्निर्देशित भी कर सकते हैं।

javap -c <name of java class file> > decompiled.txt

7

आप एक जावा डिकंपाइलर चाहते हैं, आप ऐसा करने के लिए कमांड लाइन टूल javapका उपयोग कर सकते हैं । इसके अलावा, जावा Decompiler HOW-TO वर्णन करता है कि आप एक क्लास फ़ाइल को कैसे हटा सकते हैं।


2

आप एक जावा डी-कंपाइलर की तलाश कर रहे हैं। मैं JAD http://www.kpdus.com/jad.html की सलाह देता हूं कि यह गैर वाणिज्यिक उपयोग के लिए मुफ्त है और काम पूरा कर लेता है।

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


2

cpuguru, यदि आपके एपलेट को javac 1.3 (या उससे कम) के साथ संकलित किया गया है, तो आपका सबसे अच्छा विकल्प Jad का उपयोग करना है।

दुर्भाग्यवश, JAD 1.5.8 (Apr 14, 2001) द्वारा समर्थित अंतिम JDK JDK 1.3 है।

यदि आपका एप्लेट हाल ही में संकलक के साथ संकलित किया गया है, तो आप जेडी-जीयूआई की कोशिश कर सकते हैं : यह डिकंपाइलर विकास के तहत है, फिर भी, यह सही जावा स्रोतों को उत्पन्न करता है, ज्यादातर समय, जेडीकेटी 1.4, 1.5 या 1.6 के साथ संकलित कक्षाओं के लिए।

डैरन, आपकी पोस्ट के लिए धन्यवाद। JD-GUI अभी तक का सबसे अच्छा डिकंपाइलर नहीं है ... लेकिन मैं काम कर रहा हूं :)



2

जद को विघटित करने के लिए उपयोग करना संभवतः आपका सबसे अच्छा विकल्प है। जब तक कोड को बाधित नहीं किया गया है, तब तक यह ठीक परिणाम देगा।



1

आपको एक डिकम्पॉइलर का उपयोग करने की आवश्यकता है। दूसरों ने जेएडी का सुझाव दिया है, अन्य विकल्प हैं, जेएडी सबसे अच्छा है।

मैं उन टिप्पणियों को प्रतिध्वनित करूँगा कि आप मूल स्रोत कोड की तुलना में थोड़ा खो सकते हैं। यह विशेष रूप से अजीब लग रहा है अगर कोड जेनेरिक का उपयोग करता है, इरेज़र के कारण।



1

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


0

जैसा कि सुझाव दिया गया है कि आप JAD का उपयोग इसे विघटित करने और फ़ाइलों को देखने के लिए कर सकते हैं। इसे पढ़ने के लिए आसान बनाने के लिए आप ग्रहण के लिए JADclipse प्लगइन का उपयोग कर सकते हैं ताकि JAD को सीधे ग्रहण किया जा सके या डीजे जावा Decompiler का उपयोग किया जा सके जो कमांड लाइन JAD की तुलना में उपयोग करना बहुत आसान है


0

यदि आप परिणाम के रूप में पठनीय जावा कोड चाहते हैं तो JAD एक उत्कृष्ट विकल्प है। यदि आप वास्तव में .classफ़ाइल स्वरूप के आंतरिक भाग में खुदाई करना चाहते हैं , तो आप चाहते हैंjavap । यह JDK के साथ जुड़ा हुआ है और आपको पठनीय ASCII में हेक्साडेसिमल बाइटेकोड को "विघटित" करने की अनुमति देता है। यह जिस भाषा का उत्पादन करता है वह अभी भी बायटेकोड है (जावा जैसी कुछ भी नहीं), लेकिन यह काफी पठनीय और बेहद शिक्षाप्रद है।

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


0

Applet.class को विघटित करने की कोई आवश्यकता नहीं है। सार्वजनिक जावा एपीआई क्लासेस सोर्सकोड जेडीके (यदि आप इसे स्थापित करना चुनते हैं) के साथ आता है, और डिकोडेड बायटेकोड की तुलना में बेहतर पठनीय है। आप src.zip (अपने JDK स्थापना फ़ोल्डर में स्थित) में संपीड़ित पा सकते हैं।



हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.