
जावा बाइटकोड से जावा में डीकंपाइलर, IntelliJ IDEA में उपयोग किया जाता है।
Fernflower, Java और संभवतः सामान्यतः एक उच्च-स्तरीय प्रोग्रामिंग भाषा के लिए पहला वास्तविक रूप से कार्यशील विश्लेषणात्मक डीकंपाइलर है।
रिलीज़ Intellij Community repository में प्रकाशित की जाती हैं।
कृपया अपनी बग रिपोर्ट और फीचर अनुरोध issue tracker (सबसिस्टम Java. Decompiler. Engine में) पर भेजें।
Fernflower IntelliJ IDEA में बंडल किया जाता है और इसका प्राथमिक उपयोग डिबगिंग या क्लास फ़ाइलों में नेविगेट करते समय Java कोड दिखाने के लिए किया जाता है।
Fernflower को निम्नलिखित कमांड का उपयोग करके स्टैंड-अलोन मोड में कमांड लाइन से चलाया जा सकता है:
java -jar fernflower.jar [-<option>=<value>]* [<source>]+ <destination>
* का अर्थ है शून्य या अधिक बार
+ का अर्थ है एक या अधिक बार
<source>: डीकंपाइल की जाने वाली फ़ाइलों वाली फ़ाइल या निर्देशिका।
निर्देशिकाओं को पुनरावर्ती रूप से स्कैन किया जाता है।
अनुमत फ़ाइल एक्सटेंशन class, zip और jar हैं।
-e= के साथ उपसर्गित स्रोतों का अर्थ "लाइब्रेरी" फ़ाइलें हैं जिन्हें डीकंपाइल नहीं किया जाएगा लेकिन कक्षाओं या विधियों के बीच संबंधों का विश्लेषण करते समय उन्हें ध्यान में रखा जाएगा।
विशेष रूप से पहचानकर्ताओं का नाम बदलना (नीचे ren विकल्प देखें) बाहरी कक्षाओं की जानकारी से लाभ उठा सकता है।
<destination>: परिणामी Java स्रोत को रखने के लिए गंतव्य निर्देशिका
<option>=<value>: संबंधित मान के साथ एक कमांड-लाइन विकल्प (नीचे "कमांड-लाइन विकल्प" देखें)।
java -jar fernflower.jar -hes=0 -hdc=0 c:\Temp\binary\ -e=c:\Java\rt.jar c:\Temp\source\
java -jar fernflower.jar -dgs=1 c:\Temp\binary\library.jar c:\Temp\binary\Boot.class c:\Temp\source\
mpm और urc को छोड़कर, मान 1 का अर्थ है कि विकल्प सक्रिय है, 0 - निष्क्रिय।
यदि कोई हो, तो डिफ़ॉल्ट मान कोष्ठक में दिया गया है।
आमतौर पर, निम्नलिखित विकल्प उपयोगकर्ता द्वारा बदले जाएंगे, यदि कोई हों: hes, hdc, dgs, mpm, ren, urc बाकी विकल्पों को वैसे ही छोड़ा जा सकता है: वे पेशेवर रिवर्स इंजीनियरों के लिए लक्षित हैं।
rbr (1): ब्रिज विधियों को छुपाएंrsy (0): सिंथेटिक क्लास सदस्यों को छुपाएंdin (1): आंतरिक कक्षाओं को डीकंपाइल करेंdc4 (1): 1.4 क्लास संदर्भों को संक्षिप्त करेंdas (1): असर्टशन को डीकंपाइल करेंhes (1): खाली सुपर इन्वोकेशन को छुपाएंhdc (1): खाली डिफ़ॉल्ट कंस्ट्रक्टर को छुपाएंdgs (0): जेनेरिक सिग्नेचर को डीकंपाइल करेंner (1): मान लें कि रिटर्न अपवाद नहीं फेंकताden (1): एनुमरेशन को डीकंपाइल करेंrgn (1): getClass() इन्वोकेशन को हटाएं, जब वह एक योग्य नए स्टेटमेंट का हिस्सा होlit (0): संख्यात्मक लिटरल को "ज्यों का त्यों" आउटपुट करेंकुछ ऑबफस्केटर कक्षाओं और उनके सदस्य तत्वों को छोटे, अर्थहीन और सबसे बढ़कर अस्पष्ट नाम देते हैं। ऐसे कोड का पुनर्संकलन करने से बड़ी संख्या में विरोध उत्पन्न होते हैं। इसलिए, डीकंपाइलर को अपनी ओर से तत्वों का नाम बदलने देना उचित है, ताकि प्रत्येक पहचानकर्ता की विशिष्टता सुनिश्चित हो सके।
विकल्प ren (अर्थात -ren=1) नाम बदलने की कार्यक्षमता को सक्रिय करता है। डिफ़ॉल्ट नाम बदलने की रणनीति इस प्रकार है:
org.jetbrains.java.decompiler.main.extern.IMemberIdentifierRenamer को लागू करता है, विकल्प urc में (उदा. -urc=com.example.MyRenamer) Fernflower को। क्लास एप्लिकेशन क्लासपाथ पर उपलब्ध होनी चाहिए।प्रत्येक विधि का अर्थ नामकरण से स्पष्ट होना चाहिए: toBeRenamed यह निर्धारित करता है कि तत्व का नाम बदला जाएगा या नहीं, जबकि अन्य तीन क्रमशः कक्षाओं, विधियों और फ़ील्ड के लिए नए नाम प्रदान करते हैं।
एक निष्पादन योग्य स्टार्टअप स्क्रिप्ट बनाएं:
./gradlew :installDist
स्टार्टअप स्क्रिप्ट build/install/engine/bin में उत्पन्न होती है।
Fernflower IntelliJ Community प्रोजेक्ट का हिस्सा है, योगदान का स्वागत है, पैच भेजने का पसंदीदा तरीका IntelliJ कम्युनिटी रिपॉजिटरी में पुल रिक्वेस्ट बनाना है। पैच जमा करते समय, कृपया योगदान दिशानिर्देशों का पालन करें।
Fernflower Apache License Version 2.0 के तहत लाइसेंस प्राप्त है।
Fernflower मूल रूप से Stiver द्वारा विकसित किया गया था, लेकिन 2014 से JetBrains द्वारा बनाए रखा गया है। ForgeFlower से कुछ पैच इस रिपॉजिटरी में विलय किए गए थे। Fernflower का मिरror भी Andrew McRae द्वारा लंबे समय तक बनाए रखा गया था।
सही नाम Fernflower है, न कि FernFlower।
asc (0): स्ट्रिंग और कैरेक्टर लिटरल में गैर-ASCII वर्णों को यूनिकोड एस्केप के रूप में एनकोड करेंbto (1): int 1 को बूलियन true के रूप में व्याख्या करें (एक कंपाइलर बग के लिए वर्कअराउंड)nns (0): सिंथेटिक एट्रीब्यूट सेट न होने की अनुमति दें (एक कंपाइलर बग के लिए वर्कअराउंड)uto (1): नामहीन प्रकारों को java.lang.Object के रूप में मानें (एक कंपाइलर आर्किटेक्चर दोष के लिए वर्कअराउंड)udv (1): यदि उपलब्ध हो, तो डीबग जानकारी से वेरिएबल नामों का पुनर्निर्माण करेंump (1): यदि उपलब्ध हो, तो संबंधित एट्रीब्यूट से पैरामीटर नामों का पुनर्निर्माण करेंrer (1): खाली अपवाद रेंज हटाएंfdi (1): फाइनली स्ट्रक्चर को डी-इनलाइन करेंmpm (0): प्रति डीकंपाइल विधि अधिकतम अनुमत प्रसंस्करण समय, सेकंड में। 0 का अर्थ कोई ऊपरी सीमा नहींren (0): अस्पष्ट (या अस्पष्ट) कक्षाओं और क्लास तत्वों का नाम बदलेंurc (-): IIdentifierRenamer इंटरफ़ेस को लागू करने वाली उपयोगकर्ता-प्रदत्त क्लास का पूरा नाम। इसका उपयोग यह निर्धारित करने के लिए किया जाता है कि किन क्लास पहचानकर्ताओं का नाम बदला जाना चाहिए और नए पहचानकर्ता नाम प्रदान करता है (देखें "पहचानकर्ताओं का नाम बदलना")inn (1): IntelliJ IDEA-विशिष्ट @NotNull एनोटेशन की जाँच करें और यदि मिले तो डाले गए कोड को हटा देंlac (0): लैम्ब्डा एक्सप्रेशन को अनाम कक्षाओं में डीकंपाइल करेंnls (0): आउटपुट के लिए उपयोग करने के लिए एक नई पंक्ति वर्ण परिभाषित करें। 0 - '\r\n' (Windows), 1 - '\n' (Unix), डिफ़ॉल्ट OS-निर्भर हैind: इंडेंटेशन स्ट्रिंग (डिफ़ॉल्ट 3 स्पेस है)crp (0): जहाँ संभव हो, रिकॉर्ड पैटर्न का उपयोग करेंcps (0): जहाँ संभव हो, पैटर्न वाले स्विच का उपयोग करेंlog (INFO): एक लॉगिंग स्तर, संभावित मान TRACE, INFO, WARN, ERROR हैंiec (0): डीकंपाइल करते समय संपूर्ण क्लासपाथ को संदर्भ में शामिल करेंisl (1): सरल लैम्ब्डा एक्सप्रेशन को इनलाइन करेंucrc (1): अनावश्यक रिकॉर्ड कंस्ट्रक्टर और गेटर्स को छुपाएंcci (1): जाँचें कि try-with-resources में संसाधन वास्तव में AutoCloseable इंटरफ़ेस को लागू करता है या नहींjvn (0): किसी भी स्थानीय वेरिएबल नाम को JAD शैली के नामों से ओवरराइट करेंjpr (0): JAD नामकरण में पैरामीटर नाम शामिल करेंpbo (0): जब बिटवाइज़/शिफ्ट ऑपरेटरों को अंकगणित के साथ मिलाया जाता है, तो स्पष्ट करने वाले कोष्ठक जोड़ें