mike-neckのブログ

Java or Groovy or Swift or Golang

Kotlinのコンパイラーが吐き出すクラスまとめ

リフレクションをいろいろいじっていて気になったので中途半端にまとめてみた

Kotlin クラスのメモ

Kotlinをコンパイルすると生成されるクラス

  • クラス/インターフェース/enum/オブジェクト1つにつき1つのクラス
  • パッケージに所属する関数/プロパティ -> Ktクラス
  • インターフェースに記述した実装 -> $DefaultImplsクラス
  • 関数クラスやobjectワードによって生成される実装クラス -> $1など数字で終わるクラス
  • enumのメンバーに実装する -> EnumClass$Memberクラス
  • when式でenumによる条件マッピング -> $WhenMappingsクラス
  • コンパニオンオブジェクト -> $Companionクラス

例: compile-sample.kt

fun hello(name: String) = "Hello, $name"
class Foo {
  val upper: (String) -> String = String::toUpperCase
  companion object {
    fun printable(c: Color): Boolean =
        when(c) {
          BLACK -> true
          WHITE -> false
          BLUE  -> true
        }
  }
}
enum class Color {
  BLACK { override fun asString() = "black" },
  WHITE { override fun asString() = "white" },
  BLUE  { override fun asString() = "blue"  };
  abstract fun asString(): String
}
interface Bar {
  val name: String
  fun plus(x: Int, y: Int): Int = x + y
}

上記のコードをコンパイルした場合は次のクラスファイルが生成される

  • Bar$DefaultImpls.class
  • Bar.class
  • Color$BLACK.class
  • Color$BLUE.class
  • Color$WHITE.class
  • Color.class
  • Compile_sampleKt.class
  • Foo$Companion$WhenMappings.class
  • Foo$Companion.class
  • Foo$upper$1.class
  • Foo.class

なお、これらのファイルをjavapすると次のようになる。

Bar$DefaultImpls.class

Compiled from "compile-sample.kt"
public final class Bar$DefaultImpls {
  public static int plus(Bar, int, int);
}

Bar.class

Compiled from "compile-sample.kt"
public interface Bar {
  public abstract java.lang.String getName();
  public abstract int plus(int, int);
}

Color$BLACK.class

Compiled from "compile-sample.kt"
public final class Color$BLACK extends Color {
  public java.lang.String asString();
  Color$BLACK();
}

Color.class

Compiled from "compile-sample.kt"
public abstract class Color extends java.lang.Enum<Color> {
  public static final Color BLACK;
  public static final Color WHITE;
  public static final Color BLUE;
  static {};
  public abstract java.lang.String asString();
  protected Color();
  public static Color[] values();
  public static Color valueOf(java.lang.String);
}

Compile_sampleKt.class

Compiled from "compile-sample.kt"
public final class Compile_sampleKt {
  public static final java.lang.String hello(java.lang.String);
}

Foo$Companion$WhenMappings.class

Compiled from "compile-sample.kt"
public final class Foo$Companion$WhenMappings {
  public static final int[] $EnumSwitchMapping$0;
  static {};
}

Foo$Companion.class

Compiled from "compile-sample.kt"
public final class Foo$Companion {
  public final boolean printable(Color);
  public Foo$Companion(kotlin.jvm.internal.DefaultConstructorMarker);
}

Foo$upper$1.class

Compiled from "compile-sample.kt"
final class Foo$upper$1 extends kotlin.jvm.internal.FunctionReference implements kotlin.jvm.functions.Function1<java.lang.String, java.lang.String> {
  public static final Foo$upper$1 INSTANCE;
  public java.lang.Object invoke(java.lang.Object);
  public final java.lang.String invoke(java.lang.String);
  public final kotlin.reflect.KDeclarationContainer getOwner();
  public final java.lang.String getName();
  public final java.lang.String getSignature();
  Foo$upper$1();
  static {};
}

Foo.class

Compiled from "compile-sample.kt"
public final class Foo {
  public static final Foo$Companion Companion;
  public final kotlin.jvm.functions.Function1<java.lang.String, java.lang.String> getUpper();
  public Foo();
  static {};
}

特にオチはない(おわり)