2016-04-23 10 views
9

私は、各Kotlinクラスに追加されたMetaData注釈でどのようなデータが保持されているのか知りたいです。kotlin.MetaDataに保持されているデータの形式はどこに文書化されていますか?

は、しかし、ほとんどのフィールドは、「カスタム形式のメタデータ。フォーマットは、異なる種類の異なる(または存在しない)であってもよい。」

以下詳細を与えません

https://github.com/JetBrains/kotlin/blob/master/core/runtime.jvm/src/kotlin/Metadata.kt

このデータを解釈する方法を説明した資料のどこかがありますか?

+5

'Metadata'はすべての情報をコード化されたprotobufとして保存します。そのスキームは[公式リポジトリ](https://github.com/JetBrains/kotlin/blob/ee50aec7342ab375a105bb318e6501135e859028/core/deserialization/src/descriptors.proto)にあります。現時点でその情報を読むための正式なAPIはありませんが、[内部API](https://gist.github.com/nsk-mironov/8c9c3092e9844233cdbb)を使用して引き続きアクセスできます。 –

+1

@VladimirMironovコメントはどうですか?あなたはかなり正しいので、アフリカ。 – IRus

+0

@irus私はむしろ[Alexander Udalov](http://stackoverflow.com/users/288456/alexander-udalov)からの回答を待っています –

答えて

8

kotlin.Metadataには、名前、署名、タイプ間の関係などのKotlinシンボルに関する情報が含まれています。この情報の一部はクラスファイルのJVMシグネチャには既に存在しますが、 JVMクラスファイルが正しく表現できないKotlin特有のもの:null可能性、可変/読取り専用の収集インタフェース、宣言サイトの分散などです。ほとんどのユーザーのために、このようなデータは、実行時にプログラムをイントロスペクトするのに必要とされているので、

んが特定のアクションは、この注釈の公共の場でエンコードされたデータのスキーマを作成するために取られなかった、とKotlin reflection libraryはそのための素敵なAPIを提供します。

リフレクションAPIで公開されていないKotlin固有のものを調べる必要がある場合、またはそのアノテーションに他に何が格納されているのかが気になる場合は、kotlinx.reflect.liteの実装をご覧ください。これは軽量ライブラリです。その中核はprotobuf生成のスキーマパーサーです。現時点ではあまりサポートされていませんが、schemasが利用可能です。 必要なその他のデータを読むことができます。