Cách chuyển đổi tệp nguồn Kotlin thành tệp nguồn Java


390

Tôi có một tệp nguồn Kotlin, nhưng tôi muốn dịch nó sang Java.

Làm cách nào tôi có thể chuyển đổi Kotlin sang nguồn Java?


10
Tôi khá chắc chắn rằng chưa có công cụ tự động nào được xây dựng cho việc này. Bạn có thể xây dựng nó đầu tiên!
Eric Cochran

7
Rất có khả năng bạn sẽ kết thúc với một lớp Java xấu xí và không thể nhầm lẫn sẽ không chạy nếu bạn không có thư viện chuẩn Kotlin trong đường dẫn lớp. Vấn đề ở đây là gì?
yole

3
Hãy xem xét các dịch giả j2objC. Sẽ thật tuyệt nếu bạn có thể làm kotlin -> Java -> objC
Patrick

3
Mục tiêu của nút "Biên dịch" là giúp mọi người hiểu cách thức hoạt động của trình biên dịch Kotlin. Mã Java mà nó tạo ra không nhằm mục đích sử dụng làm mã sản xuất thực tế (và khá phù hợp với điều đó - để bắt đầu, nó không phải lúc nào cũng được biên dịch ...)
yole

2
@yole làm thế nào đối với những người không biết về Kotlin hoặc có thời gian để tìm hiểu nó và đã có một số mã mẫu trong ngôn ngữ đó có một số chức năng họ cần hiểu để làm cho mã Java của họ hoạt động?
Michael

Câu trả lời:


400

Như @Vadzim đã nói, trong IntelliJ hoặc Android Studio, bạn chỉ cần thực hiện các thao tác sau để lấy mã java từ kotlin:

  1. Menu > Tools > Kotlin > Show Kotlin Bytecode
  2. Bấm vào Decompilenút
  3. Sao chép mã java

Cập nhật:

Với phiên bản gần đây (1.2+) của plugin Kotlin, bạn cũng có thể trực tiếp làm Menu > Tools > Kotlin -> Decompile Kotlin to Java.


60
Là đầu ra Java không xấu?
Pacerier

20
@Pacerier Giống như hầu hết các đầu ra dịch ngược, dĩ nhiên là vậy
Louis CAD

5
chuyển đổi từ kotlin sang java. Nhưng nó hiển thị thêm mã. đoạn mã mà tôi thậm chí chưa bao giờ viết hoặc nghe
Nauman Ash

20
tùy chọn đó không được kích hoạt, nó có màu xám. Làm thế nào để tôi kích hoạt nó.
Vikas Pandey

8
@VikasPandey, Decompile Kotlin to Javahiện chỉ được kích hoạt cho các lớp Kotlin được biên dịch .
Onik

39

Bạn có thể biên dịch Kotlin thành mã byte, sau đó sử dụng trình dịch ngược Java.

Việc dịch ngược có thể được thực hiện bên trong IntelliJ Idea hoặc sử dụng FernFlower https://github.com/fesh0r/fernflower (cảm ơn @Jire)

Không có công cụ tự động như tôi đã kiểm tra vài tháng trước (và không có kế hoạch cho một AFAIK)


2
Là một lưu ý phụ, lưu ý rằng các tổng quát trong mã được tạo có thể gây ra các cảnh báo của trình biên dịch, vì Kotlin cho phép một số thứ mà trình biên dịch java không có. Nó vẫn hoạt động trong mã byte, mặc dù.
Jacob Zimmerman

@voddan Tôi nghĩ rằng anh ấy đang đề cập đến các thế hệ thống nhất, không có khả năng trong Java thuần túy.
Jire

1
Các tướng được thống nhất của @Jire luôn được nội tuyến, do đó, từ Java trông giống như các tham chiếu lớp bình thường
voddan

3
Đây là những gì tôi đang nói về stackoverflow.com/questions/34762029/ trộm
Jacob Zimmerman

4
IntelliJ IDEA 2016.2: Menu / Công cụ / Kotlin / Hiển thị mã byte của Kotlin, sau đó nhấp vào nút dịch ngược
Vadzim


7

Để chuyển đổi Kotlintệp nguồn thành tệp Javanguồn bạn cần (khi bạn vào Android Studio):

  1. Bấm Cmd- Shift- Atrên máy Mac hoặc bấm Ctrl- Shift- Atrên máy Windows.

  2. Nhập hành động bạn đang tìm kiếm: Kotlin Bytecodevà chọn Show Kotlin Bytecodetừ menu.

nhập mô tả hình ảnh ở đây

  1. Nhấn Decompilenút trên cùng của Kotlin Bytecodebảng điều khiển.

nhập mô tả hình ảnh ở đây

  1. Bây giờ bạn có được một tệp Java được dịch ngược cùng với tệp Kotlin trong một tab liền kề:

nhập mô tả hình ảnh ở đây


1
Cảm ơn ngài! Lỗi này AS một lần nữa thay đổi các công cụ bình thường (Công cụ> Kotlin> ...).
CoolMind

5

Tôi biên dịch mã Kotlin thành mã byte và sau đó biên dịch mã đó sang Java. Tôi biên dịch với trình biên dịch Kotlin và khử biên dịch với cfr .

Dự án của tôi ở đây .

Điều này cho phép tôi biên dịch này:

package functionsiiiandiiilambdas.functions.p01tailiiirecursive

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

Về điều này:

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

Như @ louis-cad đã đề cập đến "Nguồn Kotlin -> Mã byte của Java -> Nguồn Java" là giải pháp duy nhất cho đến nay.

Nhưng tôi muốn đề cập đến cách mà tôi thích: sử dụng trình dịch ngược Jadx cho Android .

Nó cho phép xem mã tạo để đóng và đối với tôi, mã kết quả là "sạch hơn" sau đó là mã từ trình dịch ngược IntelliJ IDEA.

Thông thường khi tôi cần xem mã nguồn Java của bất kỳ lớp Kotlin nào tôi đều làm:

  • Tạo apk: ./gradlew assembleDebug
  • Mở apk bằng GUI Jadx: jadx-gui ./app/build/outputs/apk/debug/app-debug.apk

Trong GUI chức năng IDE cơ bản này hoạt động: tìm kiếm lớp, nhấp để đi khai báo. Vân vân.

Ngoài ra tất cả các mã nguồn có thể được lưu và sau đó được xem bằng các công cụ khác như IntelliJ IDEA.


Tốt, nó có sẵn thông qua Homebrew:brew install jadx
milosmns

2
  1. mở tập tin kotlin trong studio android
  2. đi tới công cụ -> kotlin -> kotlin bytecode
  3. trong cửa sổ mới mở bên cạnh tệp kotlin của bạn, nhấp vào nút dịch ngược. nó sẽ tạo java tương đương với tệp kotlin của bạn.

2

Java và Kotlin chạy trên Máy ảo Java (JVM).

Việc chuyển đổi một tệp Kotlin thành tệp Java bao gồm hai bước, tức là biên dịch mã Kotlin thành mã byte JVM và sau đó dịch ngược mã byte thành mã Java.

Các bước để chuyển đổi tệp nguồn Kotlin của bạn thành tệp nguồn Java:

  1. Mở dự án Kotlin của bạn trong Android Studio.
  2. Sau đó điều hướng đến Công cụ -> Kotlin -> Hiển thị mã byte của Kotlin.

nhập mô tả hình ảnh ở đây

  1. Bạn sẽ nhận được mã byte của tệp Kotin của mình.
  2. Bây giờ hãy nhấp vào nút dịch ngược để lấy mã Java của bạn từ mã byte
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.