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?
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?
Câu trả lời:
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:
Menu > Tools > Kotlin > Show Kotlin Bytecode
Decompile
nútCậ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
.
Decompile Kotlin to Java
hiện chỉ được kích hoạt cho các lớp Kotlin được biên dịch .
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)
Để chuyển đổi
Kotlin
tệp nguồn thành tệpJava
nguồn bạn cần (khi bạn vào Android Studio):
Bấm Cmd- Shift- Atrên máy Mac hoặc bấm Ctrl- Shift- Atrên máy Windows.
Nhập hành động bạn đang tìm kiếm: Kotlin Bytecode
và chọn Show Kotlin Bytecode
từ menu.
Decompile
nút trên cùng của Kotlin Bytecode
bảng điều khiển.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);
}
}
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:
./gradlew assembleDebug
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.
brew install jadx
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: