KotlinソースファイルをJavaソースファイルに変換する方法


389

Kotlinソースファイルがありますが、それをJavaに変換したいと考えています。

KotlinをJavaソースに変換するにはどうすればよいですか?


10
このための自動化ツールはまだ構築されていないと私は確信しています。最初に作成できます!
Eric Cochran

7
クラスパスにKotlin標準ライブラリがない場合、実行できない醜くてメンテナンス不可能なJavaクラスが作成される可能性が非常に高くなります。ポイントは何ですか?
ヨーレ

3
j2objCトランスレータを検討してください。kotlin-> Java-> objC
Patrick

3
[逆コンパイル]ボタンの目的は、Kotlinのコンパイルの仕組みを理解してもらうことです。それが生成するJavaコードは、実際の本番用コードとして使用するためのものではありません(そして、それにはあまり適していません
そもそも、

2
@yole Kotlinを知らないか、それを学ぶ時間がなく、Javaコードを機能させるために理解する必要があるいくつかの機能を備えた、その言語のサンプルコードを持っている人にとってはどうですか?
マイケル

回答:


400

@Vadzimが言ったように、IntelliJまたはAndroid Studioでは、kotlinからJavaコードを取得するには、次の手順を実行するだけです。

  1. Menu > Tools > Kotlin > Show Kotlin Bytecode
  2. クリックしてDecompile、ボタン
  3. Javaコードをコピーする

更新:

Kotlinプラグインの最新バージョン(1.2以降)では、直接実行することもできますMenu > Tools > Kotlin -> Decompile Kotlin to Java


60
Java出力は見苦しくありませんか?
パセリエ2017年

20
@Pacerierほとんどの逆コンパイル出力と同じように、もちろんそれはもちろんです
Louis CAD

5
kotlinからjavaに変換されます。しかし、追加のコードを示しています。私が書いたことも聞いたこともないコード
Nauman Ash

20
このオプションは有効ではなく、灰色になっています。どうすれば有効にできますか?
Vikas Pandey

8
@VikasPandey Decompile Kotlin to Javaは現在、コンパイル済みのKotlinクラスでのみ有効です。
Onik 2018

39

Kotlinをバイトコードにコンパイルしてから、Java逆アセンブラを使用できます。

逆コンパイルはIntelliJ Idea内で、またはFernFlowerを使用して行うことができますhttps://github.com/fesh0r/fernflower(thanks @Jire)

数か月前に確認したので自動化ツールはありませんでした(そして1つのAFAIKの計画はありませんでした)


2
副次的な注意として、KotlinはJavaコンパイラーが行わないことをいくつか許可しているため、生成されたコードのジェネリックはコンパイラー警告を引き起こす可能性があることに注意してください。それでもバイトコードで動作します。
Jacob Zimmerman

@voddan私は彼が具体化されたジェネリックを参照していると思いますが、それは純粋なJavaでは可能ではありません。
Jire

1
@Jireの具体化されたジェネリックは常にインライン化されるため、Javaからは通常のクラス参照のように見えます
voddan

3
これが私が話しているものです。stackoverflow.com/ questions / 34762029
Jacob Zimmerman

4
IntelliJ IDEA 2016.2:Menu / Tools / Kotlin / Show Kotlin Bytecode、click Decompile button
Vadzim


7

ソースファイルを必要なKotlinソースファイルに変換するにはJava(Android Studioの場合):

  1. プレスCmd- Shift- Aマック、またはを押して上のCtrl- Shift- AWindowsマシン上で。

  2. 探しているアクションを入力し、メニューからKotlin Bytecode選択Show Kotlin Bytecodeします。

ここに画像の説明を入力してください

  1. パネルDecompile上部のボタンを押しますKotlin Bytecode

ここに画像の説明を入力してください

  1. これで、隣接するタブにKotlinファイルとともに逆コンパイルされたJavaファイルが表示されます。

ここに画像の説明を入力してください


1
ありがとうございます!このバグの多いASにより、通常のツールが再び変更されました([ツール]> [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ソース」がこれまでの唯一のソリューションです。

しかし、私は、私が好む方法を述べたいと思います:Android向けのJadxデコンパイラーの使用。

これにより、クロージャーの生成コードを確認できます。また、私にとっては、生成されるコードはIntelliJ IDEAデコンパイラーのコードよりも「クリーン」です。

通常、私が行うKotlinクラスのJavaソースコードを表示する必要がある場合:

  • APKを生成: ./gradlew assembleDebug
  • Jadx GUIを使用してapkを開きます。 jadx-gui ./app/build/outputs/apk/debug/app-debug.apk

このGUIでは、基本的なIDE機能が機能します。クラス検索、クリックして宣言に移動します。等

また、すべてのソースコードを保存して、IntelliJ IDEAなどの他のツールを使用して表示することもできます。


いいですね、Homebrewから入手できます:brew install jadx
milosmns '15 / 09/15

2
  1. Android StudioでKotlinファイルを開く
  2. ツールに移動-> kotlin-> kotlinバイトコード
  3. kotlinファイルの横に開く新しいウィンドウで、逆コンパイルボタンをクリックします。それはあなたのkotlinファイルに相当するJavaを作成します。

2

JavaとKotlinは、Java仮想マシン(JVM)で実行されます。

KotlinファイルをJavaファイルに変換するには、KotlinコードをJVMバイトコードにコンパイルしてから、バイトコードをJavaコードに逆コンパイルするという2つのステップが必要です。

KotlinソースファイルをJavaソースファイルに変換する手順:

  1. Android StudioでKotlinプロジェクトを開きます。
  2. 次に、Tools-> Kotlin-> Show Kotlin Bytecodeに移動します。

ここに画像の説明を入力してください

  1. Kotinファイルのバイトコードを取得します。
  2. 次に、[逆コンパイル]ボタンをクリックして、バイトコードからJavaコードを取得します。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.