this、等価性、演算子オーバーロード、Null安全、例外の続き。変えたり端折ったり補足したりしている。アノテーションアノテーション宣言アノテーションはコードにメタデータを付加する手段。Fancyアノテーションクラスをメタアノテーションで修飾することで、アノテーションの付加属性を指定できる。アノテーションを付けられる要素のあり得る種類(クラス、関数、プロパティ、式など)を指定する。アノテーションをコンパイルされたクラスファイルに含めるかと、実行時にリフレクションを通して可視化するかどうかを指定する。@Repetableは1つのエレメントに同じアノテーションを複数回使うことを許可する。アノテーションを公開APIの一部とするか、生成されるAPIドキュメントに表示されるクラスやメソッドのシグネチャに含めるべきかどうかを指定する。アノテーションはその前に付ける。...}アクセサにも付けられる。set}コンストラクタアノテーションはパラメータを取るコンストラクタを持つかもしれない。{}パラメータの型として許されるのは以下。other"))ラムダアノテーションはラムダにも使うことができる。メソッドに適用される。これはQuasar(並列性の制御にアノテーションを使う)のようなフレームワークで便利。}アノテーション利用場所ターゲットプロパティやプライマリコンストラクタのパラメータを修飾するとき、Kotlinの要素に対応するJava要素が複数生成され、それゆえ生成されるJavaバイトコードにアノテーションが配置される場所が複数生じてしまう。アノテーションの生成を正確に指定するため、以下の書式が使える。コンストラクタの引数にvalを付けるとプロパティも一緒に生成される。プロパティにはバッキングフィールドとゲッターが生成される。Javaコンストラクタ引数を修飾する同じ書式はファイル全体の修飾にも使える。ターゲット付きのアノテーションを置く。org.jetbrains.demo同じターゲットに複数のアノテーションが必要なら、括弧を使って中にアノテーションを並べることで、ターゲットを繰り返し書くのを避けられる。Collaborator}利用場所ターゲットの全てのリストは以下。(このターゲット付きのアノテーションはJavaからは見えない)fieldget(プロパティのゲッター)set(プロパティのセッター)receiver(拡張関数やプロパティのレシーバパラメータ)param(コンストラクタ引数)setparam(プロパティのセッター引数)拡張関数のレシーバパラメータを修飾するには以下の書式を使う。複数のターゲットがあり得るなら、次のリストから最初の適用可能なターゲットが使われる。parampropertyfieldJavaアノテーションJavaアノテーションはKotlinと100%互換性がある。}}Javaで書かれたアノテーションのパラメータは順番が定義されていないので、引数を渡すのに通常の関数呼び出しの書式は利用できない。代わりに名前付き引数を使う必要がある。パラメータは特別で、名前を明示しなくていい。(可変長)パラメータになる。Cもしアノテーションの引数としてクラスを指定する必要があるなら、Kotlinクラス(KClass)を使う。Kotlinコンパイラは自動的にそれをJavaクラスに変換するので、Javaコードは普通にアノテーションと引数を見ることができる。MyClassアノテーションインスタンスの値はKotlinコードにはプロパティに見える。ann.value}リフレクションリフレクションは実行時にプログラムの構造を覗き見ることを可能とする言語やライブラリの仕組みである。Kotlinは関数やプロパティを第1級市民にしており、それらを覗き見る(つまり実行時に関数やプロパティの型や名前が分かる)ことは関数型やリアクティブスタイルを簡単に用いることと密接に結びついている。注:Javaプラットフォームでは、リフレクション機能を使うランタイムコンポーネントは別のJARファイル(kotlin-reflect.jar)として配布される。これによってリフレクションを使わないアプリケーションに要求されるランタイムライブラリサイズを削減している。ファイルを追加するのを忘れないこと。基本的なリフレクション機能は、Kotlinクラスへの実行時参照を取得すること。静的に分かっているKotlinクラスへの参照を取得するには、クラスリテラル書式が利用できる。MyClass::class参照はKClass型の値。Kotlinクラス参照はJavaクラス参照と同じではないことに注意。