1. 概要

Kotlinは、Javaとの相互運用性でよく知られています。 もちろん、これは両方ともJava仮想マシンで実行されているため可能です。つまり、同じバイトコードにコンパイルされます。

 

このチュートリアルでは、KotlinファイルからJavaファイルへの変換を実行する2つの方法について説明します。

2. KotlinをJavaに変換する理由

まず、このような変換を行う理由をいくつか考えてみましょう。

  • 内部で実際に何が起こっているのかを理解する
  • パフォーマンスの問題を調査するには
  • 私たちのプロジェクトからKotlinを取り除くために

KotlinからJavaへの変換には2つのステップが必要です。KotlinコードをJVMバイトコードにコンパイルする必要があります。 次に、結果をJavaコードに逆コンパイルする必要があります。

ただし、このプロセスでは、正しく機能する本番コードが得られることはありません。 したがって、通常はさらに手作業が必要です。

次のセクションでは、変換を実行するための2つの方法を詳しく見ていきます。

3. コマンドラインツールを使用した変換

次の内容のKotlinファイル名Sample.ktがあるとします。

fun printEvenNumbers() {
    for (i in 0..10 step 2) {
        println(i)
    }
}

まず、次のコマンドを使用してコードをコンパイルしましょう。

kotlinc Sample.kt

その結果、SampleKt.classという名前のファイルが作成されます。

次に、このファイルをJava逆コンパイルする必要があります。

これを行うには、FernFlowerを使用します。 プロジェクトをダウンロードしてGradleビルドを実行すると、fernflower.jarを取得できます。 JARファイルを取得したら、実行するコマンドは次のとおりです。

java -jar fernflower.jar SampleKt.class .

その後、ファイルSampleKt.javaが表示されます。

import kotlin.Metadata;
import kotlin.ranges.IntProgression;
import kotlin.ranges.IntRange;
import kotlin.ranges.RangesKt;

@Metadata(
   mv = {1, 1, 15},
   bv = {1, 0, 3},
   k = 2,
   d1 = 
     {"\u0000\u0006\n\u0000\n\u0002\u0010\u0002\u001a\u0006\u0010\u0000\u001a\u00020\u0001"},
   d2 = {"printEvenNumbers", ""}
)
public final class SampleKt {
   public static final void printEvenNumbers() {
      byte var3 = 0;
      IntProgression var10000 = RangesKt.step((IntProgression)(new IntRange(var3, 10)), 2);
      int i = var10000.getFirst();
      int var1 = var10000.getLast();
      int var2 = var10000.getStep();
      if (var2 >= 0) {
         if (i > var1) {
            return;
         }
      } else if (i < var1) {
         return;
      }

      while(true) {
         boolean var4 = false;
         System.out.println(i);
         if (i == var1) {
            return;
         }

         i += var2;
      }
   }
}

ご覧のとおり、コードはかなり複雑です。 さらに、Kotlin言語の依存関係がまだあります。 読みやすさとパフォーマンスのために、本番環境では役に立たないコードを入手しました。

4. IntelliJIDEAによる変換

IntelliJ IDEAを使用すると、同じ2つの手順をより便利な方法で実行できます。

ソースをバイトコードにコンパイルするには、メインコンテキストメニューからツール-> Kotlin-> Show KotlinBytecodeをクリックします。

新しいカードが表示され、JVMバイトコードが人間が読める形式で表示されるはずです。

そこから、[逆コンパイル]ボタンをクリックしてJavaファイルを作成します。 IntelliJ IDEAは内部でFernflowerを使用しているため、結果のJavaファイルは上記のファイルと同じになることに注意してください。

5. 結論

このクイックチュートリアルでは、KotlinファイルをJavaに変換する2つの方法を学びました。

また、このプロセスが役立ついくつかのケースと、本番コードでこのプロセスを避ける必要がある理由についても説明しました。