kotlin - kotlin.MetaData 中保存的数据格式是否记录在任何地方?

标签 kotlin

我很想知道添加到每个 Kotlin 类的 MetaData 注释中包含哪些数据。

但大多数字段没有提供更多细节

“自定义格式的元数据。不同种类的格式可能不同(甚至不存在)。”

https://github.com/JetBrains/kotlin/blob/master/libraries/stdlib/jvm/runtime/kotlin/Metadata.kt

是否有引用资料解释如何解释这些数据?

最佳答案

kotlin.Metadata 包含有关 Kotlin 符号的信息,例如它们的名称、签名、类型之间的关系等。其中一些信息已经存在于类文件中的 JVM 签名中,但是很多都不是,因为有很多 Kotlin 特定的东西 JVM 类文件无法正确表示:类型可空性、可变/只读集合接口(interface)、声明站点差异等。

没有采取任何具体措施来公开此注释中编码的数据架构,因为对于大多数用户来说,需要此类数据来在运行时自省(introspection)程序,而 Kotlin reflection library为此提供了一个不错的 API。

如果您需要检查未通过反射 API 公开的特定于 Kotlin 的内容,或者您​​只是好奇该注释中还存储了哪些内容,您可以查看 kotlinx.reflect.lite 的实现.它是一个轻量级库,其核心是 protobuf 生成的模式解析器。目前那里支持的不多,但是有schemas可用的 您可以使用它来读取您需要的任何其他数据。

UPD(2018 年 8 月):自从回答了这个问题后,我们发布了一个新的(实验性和不稳定的)库,旨在成为读取和修改元数据的预期方式:https://discuss.kotlinlang.org/t/announcing-kotlinx-metadata-jvm-library-for-reading-modifying-metadata-of-kotlin-jvm-class-files/7980

关于kotlin - kotlin.MetaData 中保存的数据格式是否记录在任何地方?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36816521/

相关文章:

android - 任何参数都不能使用 Gson 提供的参数来调用

java - LiveData 对象可以在 XML 中观察吗?

Kotlin 。尝试使用具体类型来解析列表和数组

java-native-interface - Kotlin/Native 自己能用吗?

android - 已检查可空性时的 Kotlin 空值检查(!!)

kotlin - 在Kotlin中转到菜单项选择上的另一个事件

java - Android Material TextInputLayout endIcon 截断 MaterialAutoCompleteTextView 中的文字

java - 无法在 RealmObject 子类中创建 ArrayList

android - 对象未添加到应用程序类线程内的 ArrayList

android - 发现多个文件的操作系统独立路径为 'META-INF/androidx.localbroadcastmanager_localbroadcastmanager.version'