Як конвертувати вихідний файл Котліна в вихідний файл Java


390

У мене є вихідний файл Котліна, але я хочу перекласти його на Java.

Як можна перетворити Kotlin в джерело Java?


10
Я впевнений, що для цього ще не створено жодного автоматизованого інструменту. Ви можете спорудити його спочатку!
Ерік Кокран

7
Цілком ймовірно, що у вас вийде потворний і незрозумілий клас Java, який не запуститься, якщо у вас немає стандартної бібліотеки Котліна на класі. У чому справа?
йоле

3
Розгляньте перекладача j2objC. Було б чудово, якби ви могли зробити kotlin -> Java -> objC
Патрік

3
Мета кнопки «Декомпілювати» - допомогти людям зрозуміти, як працює компіляція Котліна. Створений ним код Java не призначений для використання як фактичного виробничого коду (і для цього він дуже погано підходить - для початку, він не завжди
збирається

2
@yole як щодо того, хто не знає Котліна або не встигає його вивчити, і він має якийсь зразок коду на тій мові, який має певну функціональність, яку він повинен розуміти, щоб змусити свій код 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на даний момент увімкнено лише для складених класів Котліна .
Onik

39

Ви можете компілювати Котлін у байт-код, а потім використовувати розбиральник Java.

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

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


2
Зауважте, що дженерики в генерованому коді можуть спричинити попередження компілятора, оскільки Котлін дозволяє виконувати деякі речі, які компілятор Java не робить. Він все ще працює в байтовому коді.
Яків Цимерман

@voddan Я думаю, що він має на увазі рефіковані дженерики, які не є можливим у чистому Java.
Jire

1
@ Jire reified generics завжди накреслені, тому з Java вони виглядають як звичайні посилання на клас
voddan

3
Це те, про що я говорю про stackoverflow.com/questions/34762029/…
Яків Циммерман

4
IntelliJ IDEA 2016.2: Меню / Інструменти / Котлін / Показати байт-код Kotlin, потім натисніть кнопку Декомпілювати
Вадим


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 разом з файлом Котліна на сусідній вкладці:

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


1
Дякую вам сер! Ця помилка AS знову змінила звичайні інструменти (Інструменти> Котлін> ...).
CoolMind

5

Я компілюю Котлін в байт-код і потім декомпілюю його на 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 згадав "джерело Котліна -> код байта Java -> Джерело Java" - єдине рішення поки що.

Але я хотів би зазначити спосіб, який я віддаю перевагу: використання декомпілятора Jadx для Android .

Це дозволяє бачити код, що генерується для закриттів, і, як на мене, отриманий код є "чистішим", а потім декомпілятором IntelliJ IDEA.

Зазвичай, коли мені потрібно побачити вихідний код Java будь-якого класу Котліна:

  • Створити apk: ./gradlew assembleDebug
  • Відкрити apk за допомогою Jadx GUI: jadx-gui ./app/build/outputs/apk/debug/app-debug.apk

У цьому графічному інтерфейсі працює основний функціонал IDE: пошук класів, натисніть, щоб перейти до декларації. тощо.

Також увесь вихідний код можна зберегти та переглянути його за допомогою інших інструментів, таких як IntelliJ IDEA.


Хороший, він доступний через brew install jadx
домашню мову

2
  1. відкрити файл kotlin в студії Android
  2. перейти до інструментів -> kotlin -> байт-код kotlin
  3. у новому вікні, яке відкриється біля вашого файлу kotlin, натисніть кнопку декомпіляції. це створить Java-еквівалент вашого файлу kotlin.

2

Java і Kotlin працює на віртуальній машині Java (JVM).

Перетворення файлу Котліна в файл Java включає два етапи, тобто компіляцію котла Котліна в байт-код JVM, а потім декомпілюйте байт-код в код Java.

Кроки для перетворення вихідного файлу Котліна в вихідний файл Java:

  1. Відкрийте свій проект Kotlin в студії Android.
  2. Потім перейдіть до Інструменти -> Котлін -> Показати байт код Котліна.

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

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