リフレクションをいろいろいじっていて気になったので中途半端にまとめてみた
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 {}; }
特にオチはない(おわり)