วิธีแปลงไฟล์ต้นฉบับ Kotlin เป็นไฟล์ต้นฉบับ Java


390

ฉันมีไฟล์ต้นฉบับ Kotlin แต่ฉันต้องการแปลเป็น Java

ฉันจะแปลง Kotlin เป็นซอร์ส Java ได้อย่างไร


10
ฉันค่อนข้างมั่นใจว่ายังไม่มีการสร้างเครื่องมืออัตโนมัติสำหรับสิ่งนี้ คุณสามารถสร้างมันขึ้นมาก่อน!
Eric Cochran

7
มีโอกาสมากที่คุณจะจบลงด้วยคลาส Java ที่น่าเกลียดและไม่มีความเคลื่อนไหวซึ่งจะไม่ทำงานหากคุณไม่มีไลบรารี่มาตรฐาน Kotlin ใน classpath ประเด็นคืออะไร?
yole

3
พิจารณาตัวแปล j2objC คงจะดีถ้าคุณทำ kotlin -> Java -> objC
Patrick

3
เป้าหมายของปุ่ม "Decompile" คือการช่วยให้ผู้คนเข้าใจว่าการรวบรวม Kotlin ทำงานอย่างไร รหัส Java มันสร้างไม่ได้มีวัตถุประสงค์เพื่อใช้เป็นรหัสการผลิตที่เกิดขึ้นจริง (และค่อนข้างไม่ดีเหมาะสำหรับการที่ - เพื่อเริ่มต้นกับมันไม่เคยรวบรวม ... )
Yole

2
@ ใครบ้างเกี่ยวกับคนที่ไม่รู้จัก Kotlin หรือมีเวลาเรียนรู้และได้รับโค้ดตัวอย่างในภาษานั้นซึ่งมีฟังก์ชั่นบางอย่างที่พวกเขาต้องเข้าใจเพื่อให้ได้รหัส Java ของพวกเขาทำงาน?
Michael

คำตอบ:


400

ดังที่ @Vadzim กล่าวใน IntelliJ หรือ Android Studio คุณต้องทำสิ่งต่อไปนี้เพื่อรับรหัส java จาก kotlin:

  1. Menu > Tools > Kotlin > Show Kotlin Bytecode
  2. คลิกที่Decompileปุ่ม
  3. คัดลอกรหัส java

ปรับปรุง:

กับรุ่นล่าสุด (1.2 +) ของ Kotlin Menu > Tools > Kotlin -> Decompile Kotlin to Javaปลั๊กอินคุณยังสามารถทำโดยตรง


60
เอาต์พุต Java ไม่น่าเกลียดหรือไม่?
Pacerier

20
@Pacerier เช่นเดียวกับการแยกส่วนผลผลิตมันเป็นของหลักสูตร
Louis CAD

5
แปลงจาก kotlin เป็น java แต่มันแสดงรหัสพิเศษ รหัสที่ฉันยังไม่เคยเขียนหรือได้ยิน
Nauman Ash

20
ตัวเลือกนั้นไม่ได้เปิดใช้งานมันเป็นสีเทา ฉันจะเปิดใช้งานได้อย่างไร
Vikas Pandey

8
@VikasPandey Decompile Kotlin to Javaเปิดใช้งานในปัจจุบันสำหรับคลาส Kotlin ที่คอมไพล์แล้วเท่านั้น
Onik

39

คุณสามารถคอมไพล์ Kotlin เป็น bytecode จากนั้นใช้ Java disassembler

การคอมไพล์อาจทำได้ภายใน IntelliJ Idea หรือใช้ FernFlower https://github.com/fesh0r/fernflower (ขอบคุณ @Jire)

ไม่มีเครื่องมืออัตโนมัติเมื่อฉันตรวจสอบสองสามเดือนที่ผ่านมา (และไม่มีแผนสำหรับหนึ่ง AFAIK)


2
โปรดทราบว่า generics ในโค้ดที่สร้างขึ้นอาจทำให้เกิดคำเตือนคอมไพเลอร์เนื่องจาก Kotlin อนุญาตให้บางสิ่งที่คอมไพเลอร์ java ไม่ได้ มันยังคงทำงานในรหัสไบต์แม้ว่า
Jacob Zimmerman

@ voddan ฉันคิดว่าเขาหมายถึงชื่อสามัญ reified ซึ่งไม่ได้เป็นไปได้ใน Java บริสุทธิ์
Jire

1
@Jire reified generics จะ inlined เสมอดังนั้นจาก Java พวกเขามีลักษณะการอ้างอิงระดับปกติ
voddan

3
นี่คือสิ่งที่ฉันกำลังพูดถึงstackoverflow.com/questions/34762029/ …
Jacob Zimmerman

4
IntelliJ IDEA 2016.2: เมนู / เครื่องมือ / Kotlin / แสดง Kotlin Bytecode จากนั้นคลิกที่ปุ่ม Decompile
Vadzim


7

ในการแปลงKotlinไฟล์ต้นฉบับเป็นไฟล์Javaต้นฉบับคุณต้อง (เมื่อคุณอยู่ใน Android Studio):

  1. กดCmd- Shift- Aบน Mac หรือกดCtrl- Shift- Aบนเครื่อง Windows

  2. พิมพ์การกระทำที่คุณต้องการ: Kotlin BytecodeและเลือกShow Kotlin Bytecodeจากเมนู

ป้อนคำอธิบายรูปภาพที่นี่

  1. กดDecompileปุ่มที่ด้านบนของKotlin Bytecodeแผง

ป้อนคำอธิบายรูปภาพที่นี่

  1. ตอนนี้คุณจะได้รับไฟล์ Java Decompiled พร้อมกับไฟล์ Kotlin ในแท็บที่อยู่ติดกัน:

ป้อนคำอธิบายรูปภาพที่นี่


1
ขอบคุณครับ! AS buggy นี้เปลี่ยนเครื่องมือปกติอีกครั้ง (เครื่องมือ> Kotlin> ... )
CoolMind

5

ฉันคอมไพล์ Kotlin ไปเป็นรหัสไบต์แล้วทำการคอมไพล์ไฟล์นั้นไปยัง Java ฉันรวบรวมคอมไพเลอร์ Kotlin และยกเลิกการคอมไพล์ด้วยcfr CFR

โครงการของฉันอยู่ที่นี่ที่นี่

สิ่งนี้ทำให้ฉันสามารถรวบรวมสิ่งนี้:

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

ดังที่ @ louis-cad กล่าวถึง "ซอร์ส Kotlin -> โค้ดไบต์ของ Java -> ซอร์ส Java" เป็นวิธีแก้ปัญหาเดียวจนถึงปัจจุบัน

แต่ผมอยากจะพูดถึงวิธีการที่ฉันต้องการ: การใช้Jadx Decompiler สำหรับ Android

จะช่วยให้เห็นการสร้างรหัสสำหรับการปิดและสำหรับฉันรหัสผลคือ "สะอาด" แล้วหนึ่งจาก IntelliJ IDEA decompiler

โดยปกติเมื่อฉันต้องการดูซอร์สโค้ด Java ของคลาส Kotlin ใด ๆ ที่ฉันทำ:

  • สร้าง apk: ./gradlew assembleDebug
  • เปิด apk โดยใช้ Jadx GUI: jadx-gui ./app/build/outputs/apk/debug/app-debug.apk

ในฟังก์ชันการทำงานพื้นฐานของ GUI GUI นี้: การค้นหาชั้นเรียน, คลิกเพื่อไปยังการประกาศ เป็นต้น

นอกจากนี้ยังสามารถบันทึกรหัสต้นฉบับทั้งหมดแล้วดูด้วยเครื่องมืออื่น ๆ เช่น IntelliJ IDEA


สิ่งที่ดีมันสามารถใช้ได้ผ่าน Homebrew:brew install jadx
15152

2
  1. เปิดไฟล์ kotlin ใน android studio
  2. ไปที่เครื่องมือ -> kotlin -> kotlin bytecode
  3. ในหน้าต่างใหม่ที่เปิดข้างไฟล์ kotlin ของคุณคลิกปุ่มถอดรหัส มันจะสร้างเทียบเท่าจาวาของไฟล์ kotlin ของคุณ

2

Java และ Kotlin ทำงานบน Java Virtual Machine (JVM)

การแปลงไฟล์ Kotlin ไปเป็นไฟล์ Java เกี่ยวข้องกับสองขั้นตอนคือการรวบรวมรหัส Kotlin เป็น JVM bytecode จากนั้นแยกส่วน bytecode เป็นรหัส Java

ขั้นตอนในการแปลงไฟล์ต้นฉบับ Kotlin ของคุณเป็นไฟล์ต้นฉบับ Java:

  1. เปิดโครงการ Kotlin ของคุณใน Android Studio
  2. จากนั้นไปที่เครื่องมือ -> Kotlin -> แสดง Kotlin Bytecode

ป้อนคำอธิบายรูปภาพที่นี่

  1. คุณจะได้รับ bytecode ของไฟล์ Kotin ของคุณ
  2. ตอนนี้คลิกที่ปุ่ม Decompile เพื่อรับโค้ด Java ของคุณจาก bytecode
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.