A Kotlin library for reading and modifying binary metadata in Kotlin/JVM compiler-generated files.
npx @tessl/cli install tessl/maven-org-jetbrains-kotlin--kotlin-metadata-jvm@2.2.0Kotlin Metadata JVM is a JVM-specific library for reading and modifying binary metadata in Kotlin/JVM compiler-generated files. It provides APIs for introspecting class metadata, transforming metadata objects, and creating metadata from scratch for Kotlin classes.
Package Name: org.jetbrains.kotlin:kotlin-metadata-jvm
Package Type: Maven
Language: Kotlin
Installation:
Maven:
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-metadata-jvm</artifactId>
<version>2.2.0</version>
</dependency>Gradle (Kotlin DSL):
implementation("org.jetbrains.kotlin:kotlin-metadata-jvm:2.2.0")Gradle (Groovy DSL):
implementation 'org.jetbrains.kotlin:kotlin-metadata-jvm:2.2.0'import kotlin.metadata.jvm.KotlinClassMetadata
import kotlin.metadata.jvm.KotlinModuleMetadata
import kotlin.metadata.jvm.JvmMetadataVersion
import kotlin.metadata.jvm.JvmMemberSignatureimport kotlin.metadata.jvm.KotlinClassMetadata
// Read class metadata
val metadata = KotlinClassMetadata.readStrict(metadataAnnotation)
when (metadata) {
is KotlinClassMetadata.Class -> {
val klass = metadata.kmClass
println("Functions: ${klass.functions.map { it.name }}")
}
is KotlinClassMetadata.FileFacade -> {
val pkg = metadata.kmPackage
println("Top-level functions: ${pkg.functions.map { it.name }}")
}
}
// Read module metadata
val moduleBytes = File("META-INF/main.kotlin_module").readBytes()
val moduleMetadata = KotlinModuleMetadata.read(moduleBytes)
println("Package parts: ${moduleMetadata.kmModule.packageParts.keys}")Kotlin Metadata JVM is built around several key components:
KotlinClassMetadata for reading and writing Kotlin class metadata from .class filesKotlinModuleMetadata for processing .kotlin_module filesJvmMetadataVersion for handling metadata version compatibilityJvmMemberSignature for representing JVM method and field signaturesKmClass, KmFunction, KmType) for structured metadata representationCore functionality for reading, writing, and transforming Kotlin class metadata from .class files. Supports strict and lenient reading modes for version compatibility.
sealed class KotlinClassMetadata {
abstract fun write(): Metadata
abstract val version: JvmMetadataVersion
abstract val flags: Int
companion object {
fun readStrict(annotationData: Metadata): KotlinClassMetadata?
fun readLenient(annotationData: Metadata): KotlinClassMetadata?
fun transform(metadata: Metadata, transformer: (KotlinClassMetadata) -> Unit): Metadata
}
}Functionality for reading and writing .kotlin_module files that contain package structure information and compilation metadata.
class KotlinModuleMetadata(
var kmModule: KmModule,
var version: JvmMetadataVersion
) {
fun write(): ByteArray
companion object {
@JvmStatic
fun read(bytes: ByteArray): KotlinModuleMetadata
}
}Version handling system for ensuring compatibility between different Kotlin compiler versions and metadata formats.
class JvmMetadataVersion(
val major: Int,
val minor: Int,
val patch: Int = 0
) : Comparable<JvmMetadataVersion> {
companion object {
val LATEST_STABLE_SUPPORTED: JvmMetadataVersion
val HIGHEST_ALLOWED_TO_WRITE: JvmMetadataVersion
}
}System for representing JVM method and field signatures used in metadata processing and reflection operations.
sealed class JvmMemberSignature {
abstract val name: String
abstract val descriptor: String
}
data class JvmMethodSignature(
override val name: String,
override val descriptor: String
) : JvmMemberSignature()
data class JvmFieldSignature(
override val name: String,
override val descriptor: String
) : JvmMemberSignature()Additional utility classes and functions for specialized metadata operations.
// JVM-specific attribute handling utilities
object JvmAttributes
// Extension functions for JVM metadata processing
object JvmExtensions
// Utility functions for JVM metadata operations
object JvmMetadataUtil
// Java representation of Kotlin class header information
class KotlinClassHeader
// Annotation marking unstable metadata APIs
@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY)
@Retention(AnnotationRetention.BINARY)
annotation class UnstableMetadataApi(val message: String = "")These utilities provide additional functionality for metadata processing but are considered internal implementation details and may change in future versions.
// Metadata annotation type (from Kotlin stdlib)
annotation class Metadata(
val kind: Int = 1,
val metadataVersion: IntArray = [],
val data1: Array<String> = [],
val data2: Array<String> = [],
val extraString: String = "",
val packageName: String = "",
val extraInt: Int = 0
)
// Module structure types (kotlin-metadata-jvm specific)
class KmModule {
val packageParts: MutableMap<String, KmPackageParts>
val optionalAnnotationClasses: MutableList<KmClass>
}
class KmPackageParts(
val fileFacades: MutableList<String>,
val multiFileClassParts: MutableMap<String, String>
)
// Core metadata types (from kotlinx-metadata-core dependency)
// These types are used by kotlin-metadata-jvm but defined in the core library
interface KmClass {
val name: String
val functions: List<KmFunction>
val properties: List<KmProperty>
val constructors: List<KmConstructor>
}
interface KmFunction {
val name: String
val valueParameters: List<KmValueParameter>
val returnType: KmType
}
interface KmProperty {
val name: String
val returnType: KmType
}
interface KmPackage {
val functions: List<KmFunction>
val properties: List<KmProperty>
}
interface KmLambda {
val function: KmFunction?
}
interface KmType {
// Type representation
}
interface KmConstructor {
val valueParameters: List<KmValueParameter>
}
interface KmValueParameter {
val name: String?
val type: KmType
}