Как преобразовать исходный файл Kotlin в исходный файл Java


389

У меня есть исходный файл Kotlin, но я хочу перевести его на Java.

Как я могу конвертировать Kotlin в исходный код Java?


10
Я почти уверен, что для этого еще не создано никакого автоматизированного инструмента. Вы можете построить его первым!
Эрик Кохран,

7
Весьма вероятно, что в итоге вы получите уродливый и не поддерживаемый класс Java, который не будет работать, если у вас нет стандартной библиотеки Kotlin в пути к классам. В чем смысл?
Yole

3
Рассмотрим переводчик j2objC. Было бы здорово, если бы вы могли сделать kotlin -> Java -> objC
Patrick

3
Цель кнопки «Декомпилировать» - помочь людям понять, как работает компиляция Kotlin. Генерируемый Java-код не предназначен для использования в качестве реального производственного кода (и для этого он плохо подходит - для начала, он не всегда компилируется ...)
yole

2
@yole, а как насчет того, кто не знает Kotlin или у него есть время на его изучение, и у него есть некоторый пример кода на этом языке, который обладает некоторой функциональностью, которую им необходимо понять, чтобы заставить работать свой код Java?
Майкл

Ответы:


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
преобразован из Котлина в Яву. Но это показывает дополнительный код. код, который я даже никогда не писал и не слышал
Науман Эш

20
эта опция не включена, она окрашена в серый цвет. Как мне это включить.
Викас Пандей

8
@VikasPandey, Decompile Kotlin to Javaв настоящее время включен только для скомпилированных классов Kotlin .
Оник,

39

Вы можете скомпилировать Kotlin в байт-код, а затем использовать дизассемблер Java.

Декомпиляция может быть выполнена внутри IntelliJ Idea или с помощью FernFlower https://github.com/fesh0r/fernflower (спасибо @Jire)

Не было никакого автоматизированного инструмента, поскольку я проверил пару месяцев назад (и никаких планов относительно одного AFAIK)


2
В качестве примечания следует помнить, что обобщенные значения в сгенерированном коде могут вызывать предупреждения компилятора, так как Kotlin допускает некоторые вещи, которых не поддерживает компилятор java. Это все еще работает в байт-коде, хотя.
Джейкоб Циммерман

@voddan Я думаю, что он имеет в виду усовершенствованные дженерики, которые не возможны в чистой Java.
Jire

1
Преобразованные дженерики @Jire всегда встроены, поэтому с Java они выглядят как обычные ссылки на
классы


4
IntelliJ IDEA 2016.2: Меню / Инструменты / Kotlin / Показать байт-код Kotlin, затем нажмите кнопку «Декомпилировать»
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 вместе с файлом Kotlin на соседней вкладке:

введите описание изображения здесь


1
Спасибо, сэр! Эта глючная AS снова изменила обычные инструменты (Tools> Kotlin> ...).
CoolMind

5

Я компилирую Kotlin в байт-код, а затем декомпилирую его в Java. Я компилирую с помощью компилятора Kotlin и декомпилирую с помощью 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 для Android .

Это позволяет увидеть генерируемый код для замыканий, и, как по мне, полученный код «чище», чем код из декомпилятора IntelliJ IDEA.

Обычно, когда мне нужно увидеть исходный код Java любого класса Kotlin, я делаю:

  • Сгенерировать apk: ./gradlew assembleDebug
  • Откройте apk, используя Jadx GUI: jadx-gui ./app/build/outputs/apk/debug/app-debug.apk

В этом графическом интерфейсе работает базовая функциональность IDE: поиск класса, нажмите, чтобы перейти к объявлению. и т.п.

Также весь исходный код можно сохранить, а затем просмотреть с помощью других инструментов, таких как IntelliJ IDEA.


Хорошо, это доступно через Homebrew:brew install jadx
milosmns

2
  1. открыть файл kotlin в андроид студии
  2. перейти к инструментам -> kotlin -> байт-код kotlin
  3. в новом окне, которое открывается рядом с вашим файлом kotlin, нажмите кнопку декомпиляции. это создаст Java-эквивалент вашего файла Kotlin.

2

Java и Kotlin работают на виртуальной машине Java (JVM).

Преобразование файла Kotlin в файл Java включает в себя два этапа: компиляцию кода Kotlin в байт-код JVM, а затем декомпиляцию байт-кода в код Java.

Шаги для преобразования вашего исходного файла Kotlin в исходный файл Java:

  1. Откройте свой проект Kotlin в Android Studio.
  2. Затем перейдите в Инструменты -> Kotlin -> Показать байт-код Kotlin.

введите описание изображения здесь

  1. Вы получите байт-код вашего файла Kotin.
  2. Теперь нажмите кнопку декомпиляции, чтобы получить код Java из байт-кода
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.