कोटलिन स्रोत फ़ाइल को जावा स्रोत फ़ाइल में कैसे बदलें


390

मेरे पास एक कोटलिन स्रोत फ़ाइल है, लेकिन मैं इसे जावा में अनुवाद करना चाहता हूं।

मैं कोटलिन को जावा स्रोत में कैसे बदल सकता हूं?


10
मुझे पूरा यकीन है कि इसके लिए कोई स्वचालित उपकरण नहीं बनाया गया है। आप इसे पहले बना सकते हैं!
एरिक कोचरन

7
यह बहुत संभावना है कि आप एक बदसूरत और अचूक जावा वर्ग के साथ समाप्त हो जाएंगे जो क्लासपाथ में कोटलिन मानक पुस्तकालय नहीं होने पर नहीं चलेगा। क्या बात है?
Yole

3
J2objC अनुवादक पर विचार करें। बहुत अच्छा होगा यदि आप कोटलिन -> जावा -> objC
पैट्रिक

3
"डिकंपाइल" बटन का लक्ष्य लोगों को यह समझने में मदद करना है कि कोटलिन संकलन कैसे काम करता है। जावा कोड उत्पन्न वास्तविक उत्पादन कोड के रूप में उपयोग के लिए लक्षित नहीं है (और काफी खराब है कि के लिए उपयुक्त है - के साथ शुरू हो, यह हमेशा संकलन नहीं करता है ...)
Yole

2
@ कैसे किसी ऐसे व्यक्ति के बारे में जो कोटलिन को नहीं जानता है या उसके पास सीखने का समय है और उसे उस भाषा में कुछ नमूना कोड मिला है जिसमें कुछ कार्यक्षमता है जो उन्हें अपने जावा कोड को काम करने के लिए समझने की आवश्यकता है?
माइकल

जवाबों:


400

जैसा @Vadzim ने कहा, इंटेलीज या एंड्रॉइड स्टूडियो में, आपको बस वोट कोड से जावा कोड प्राप्त करने के लिए निम्नलिखित करना होगा:

  1. Menu > Tools > Kotlin > Show Kotlin Bytecode
  2. Decompileबटन पर क्लिक करें
  3. जावा कोड को कॉपी करें

अपडेट करें:

कोटलिन प्लगइन के हाल के संस्करण (1.2+) के साथ आप सीधे भी कर सकते हैं Menu > Tools > Kotlin -> Decompile Kotlin to Java


60
क्या जावा आउटपुट बदसूरत नहीं है?
पचेरियर

20
@Pacerier सबसे विघटित आउटपुट की तरह, यह निश्चित रूप से है
लुई सीएडी

5
कोटलिन से जावा में परिवर्तित। लेकिन इसके अतिरिक्त कोड दिखा रहा है। वह कोड जिसे मैंने कभी लिखा या सुना नहीं था
Nauman Ash

20
वह विकल्प सक्षम नहीं है, यह रंगीन ग्रे है। मैं इसे कैसे सक्षम करूं।
विकास पांडे

8
@VikasPandey, Decompile Kotlin to Javaवर्तमान में केवल संकलित कोटलिन वर्गों के लिए सक्षम है ।
ओणिक

39

आप कोटलिन को बायटेकोड पर संकलित कर सकते हैं, फिर एक जावा डिस्सेम्बलर का उपयोग कर सकते हैं।

डिकंपाइलिंग इंटेलीज आइडिया के अंदर की जा सकती है, या फर्नाफ्लावर https://github.com/fesh0r/fernflower का उपयोग करके (धन्यवाद @Jire)

कोई स्वचालित उपकरण नहीं था जैसा कि मैंने कुछ महीने पहले (और एक AFAIK के लिए कोई योजना नहीं) चेक किया था


2
एक साइड नोट के रूप में, ध्यान रखें कि जेनरेट किए गए कोड में जेनरिक कंपाइलर चेतावनी का कारण बन सकता है, क्योंकि कोटलिन कुछ ऐसी चीजों की अनुमति देता है जो जावा कंपाइलर नहीं करता है। यह अभी भी बाइट कोड में काम करता है, हालांकि।
जैकब ज़िमरमैन

@voddan मुझे लगता है कि वह जेनेरिकों की बात कर रहे हैं, जो शुद्ध जावा में एक संभावना नहीं है।
जिरे

1
@ जिएराइज्ड जेनरिक जेनेरिक हमेशा इनबिल्ड होते हैं, इसलिए जावा से वे सामान्य वर्ग के संदर्भ की तरह दिखते हैं
वोडन


4
IntelliJ IDEA 2016.2: मेनू / उपकरण / कोटलिन / शो कोटलीन बायटेकोड, फिर Decompile बटन पर क्लिक करें
Vadzim


7

Kotlinस्रोत फ़ाइल को स्रोत फ़ाइल में परिवर्तित करने के लिए, जिसकी Javaआपको आवश्यकता होती है (जब आप Android स्टूडियो में होते हैं):

  1. प्रेस Cmd- Shift- Aएक मैक पर, या प्रेस Ctrl- Shift- Aएक विंडोज मशीन पर।

  2. वह क्रिया लिखें जिसे आप खोज रहे हैं: Kotlin Bytecodeऔर Show Kotlin Bytecodeमेनू से चुनें।

यहां छवि विवरण दर्ज करें

  1. पैनल Decompileके शीर्ष पर बटन दबाएँ Kotlin Bytecode

यहां छवि विवरण दर्ज करें

  1. अब आपको आसन्न टैब में Kotlin फ़ाइल के साथ एक Decompiled Java फ़ाइल मिलती है:

यहां छवि विवरण दर्ज करें


1
धन्यवाद महोदय! इस छोटी गाड़ी एएस ने फिर से सामान्य उपकरण (टूल> कोटलिन> ...) को बदल दिया।
CoolMind

5

मैं कोटलिन को बाइट कोड के लिए संकलित करता हूं और फिर जावा के लिए डी-संकलन करता हूं। मैं कोटलिन कम्पाइलर के साथ संकलन करता हूं और सीएफई के साथ डी-संकलन ।

मेरा प्रोजेक्ट यहां है

यह मुझे यह संकलन करने की अनुमति देता है:

package functionsiiiandiiilambdas.functions.p01tailiiirecursive

tailrec fun findFixPoint(x: Double = 1.0): Double =
        if (x == Math.cos(x)) x else findFixPoint(Math.cos(x))

इसके लिए:

package functionsiiiandiiilambdas.functions.p01tailiiirecursive;

public final class ExampleKt {
  public static final double findFixPoint(double x) {
    while (x != Math.cos(x)) {
      x = Math.cos(x);
    }
    return x;
  }

  public static /* bridge */ /* synthetic */ double findFixPoint$default(
      double d, int n, Object object) {
    if ((n & 1) != 0) {
      d = 1.0;
    }
    return ExampleKt.findFixPoint(d);
  }
}

4

जैसा कि @ लूइस-कैड ने "कोटलिन स्रोत -> जावा के बाइट कोड -> जावा स्रोत" का अभी तक एकमात्र समाधान है।

लेकिन मैं उस तरीके का उल्लेख करना चाहूंगा, जिसे मैं पसंद करता हूं: एंड्रॉइड के लिए जेडएक्स डिकम्पॉइलर का उपयोग करना ।

यह क्लोजर के लिए जेनरेट कोड को देखने की अनुमति देता है और, मेरे लिए, परिणामस्वरूप कोड "क्लीनर" है, फिर इंटेलीज आईडीईए डिकम्पाइलर से एक है।

आम तौर पर जब मुझे किसी भी कोटलिन वर्ग के जावा स्रोत कोड को देखने की आवश्यकता होती है:

  • उत्पन्न APK: ./gradlew assembleDebug
  • JADx GUI का उपयोग करके खुला APK: jadx-gui ./app/build/outputs/apk/debug/app-debug.apk

इस GUI में बुनियादी IDE कार्यक्षमता काम करती है: वर्ग खोज, घोषणा पर जाने के लिए क्लिक करें। आदि।

इसके अलावा सभी स्रोत कोड को बचाया जा सकता है और फिर IntelliJ IDEA जैसे अन्य टूल का उपयोग करके देखा जा सकता है।


अच्छा है, यह Homebrew के माध्यम से उपलब्ध है:brew install jadx
milosmns

2
  1. एंड्रॉयड स्टूडियो में खुला कोटलिन फ़ाइल
  2. टूल्स पर जाएं -> कोटलिन -> कोटलिन बायटेकोड
  3. नई विंडो में जो आपकी कोटलिन फाइल के बगल में खुली है, डिकम्पाइल बटन पर क्लिक करें। यह आपकी कोटलिन फाइल के बराबर जावा बनाएगा।

2

जावा और कोटलिन जावा वर्चुअल मशीन (JVM) पर चलता है।

कोटलिन फ़ाइल को जावा फ़ाइल में परिवर्तित करना दो चरणों को शामिल करता है अर्थात कोटलिन कोड को जेवीएम बायटेकोड पर संकलित करना और फिर जावा कोड के लिए बायटेकोड को अपघटित करना।

अपनी कोटलिन स्रोत फ़ाइल को जावा स्रोत फ़ाइल में बदलने के लिए चरण:

  1. एंड्रॉइड स्टूडियो में अपना कोटलिन प्रोजेक्ट खोलें।
  2. फिर टूल -> कोटलिन -> कोटलिन बायटेकोड पर जाएँ।

यहां छवि विवरण दर्ज करें

  1. आपको अपनी कोटिन फाइल का बाईटेकोड मिलेगा।
  2. अब अपने Java कोड को bytecode से प्राप्त करने के लिए Decompile बटन पर क्लिक करें
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.