in hot-reload-agent/src/main/kotlin/org/jetbrains/compose/reload/agent/jdwp.kt [40:83]
override fun transform(
module: Module?, loader: ClassLoader?, className: String?, classBeingRedefined: Class<*>?,
protectionDomain: ProtectionDomain?, classfileBuffer: ByteArray?
): ByteArray? {
val classId = ClassId(className ?: return null)
if (!classId.isTransformAllowed()) return null
if (classId.isIgnored) return null
if (classBeingRedefined == null) return null
if (classfileBuffer == null) return null
if (localReloadRequest.get() != null) return null
return try {
transformLock.lock()
logger.info("Detected 'external reload' request for '${classBeingRedefined.name}'")
/* Transform */
val transformedCode = runCatching {
val clazz = getClassPool(classBeingRedefined.classLoader).makeClass(classfileBuffer.inputStream())
clazz.transformForStaticsInitialization(classBeingRedefined)
val baos = ByteArrayOutputStream()
val daos = DataOutputStream(baos)
clazz.classFile.write(daos)
baos.toByteArray()
}.getOrElse { failure ->
logger.error("Failed to transform '${className}'", failure)
classfileBuffer
}
/* Resolve bytecode after transforming */
val definition = ClassDefinition(classBeingRedefined, transformedCode)
/* Issue a request to reload the UI */
issueExternalReloadRequest(ClassDefinition(classBeingRedefined, classfileBuffer), instrumentation)
/* Return the transformed code as bytes */
definition.definitionClassFile
} catch (t: Throwable) {
logger.error("Failed to transform '${classBeingRedefined.name}'", t)
null
} finally {
transformLock.unlock()
}
}