Skip to content

Commit d04fd10

Browse files
committed
fixed hot-reloading of edited classes
1 parent b4d5ca5 commit d04fd10

2 files changed

Lines changed: 11 additions & 4 deletions

File tree

build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ plugins {
88

99
allprojects {
1010
group = "de.fabmax.kool"
11-
version = "0.16.0-SNAPSHOT"
11+
version = "0.15.1"
1212

1313
repositories {
1414
google()

kool-editor/src/desktopMain/kotlin/de/fabmax/kool/editor/AppLoader.desktop.kt

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import kotlinx.coroutines.CoroutineScope
1717
import kotlinx.coroutines.Job
1818
import java.io.BufferedReader
1919
import java.io.InputStreamReader
20+
import java.net.URL
2021
import java.net.URLClassLoader
2122
import java.nio.file.Path
2223
import java.util.concurrent.atomic.AtomicBoolean
@@ -138,7 +139,7 @@ class AppLoadServiceImpl(private val projectFiles: ProjectFiles) : AppLoadServic
138139
}
139140

140141
logD { "Loading app from directory: $buildClasses" }
141-
val loader = URLClassLoader(arrayOf(buildClasses.toUri().toURL()), this.javaClass.classLoader)
142+
val loader = ReloadingClassLoader(arrayOf(buildClasses.toUri().toURL()), this::class.java.classLoader)
142143
BehaviorLoader.appBehaviorLoader = BehaviorLoader.ReflectionAppBehaviorLoader(loader)
143144
val behaviorClasses = examineClasses(loader, buildClasses)
144145

@@ -152,7 +153,7 @@ class AppLoadServiceImpl(private val projectFiles: ProjectFiles) : AppLoadServic
152153
}
153154

154155
@OptIn(ExperimentalPathApi::class)
155-
private fun examineClasses(loader: URLClassLoader, classpath: Path): Map<KClass<*>, AppBehavior> {
156+
private fun examineClasses(loader: ReloadingClassLoader, classpath: Path): Map<KClass<*>, AppBehavior> {
156157
val behaviorClasses = mutableMapOf<KClass<*>, AppBehavior>()
157158
classpath.walk(PathWalkOption.INCLUDE_DIRECTORIES).forEach {
158159
if (!it.isDirectory() && it.name.endsWith(".class")) {
@@ -164,7 +165,7 @@ class AppLoadServiceImpl(private val projectFiles: ProjectFiles) : AppLoadServic
164165
.replace('/', '.')
165166

166167
try {
167-
val behaviorClass = loader.loadClass(className)
168+
val behaviorClass = loader.reloadClass(className)
168169
val kclass = behaviorClass.kotlin
169170
if (KoolBehavior::class.java.isAssignableFrom(behaviorClass.superclass)) {
170171
val simple = kclass.simpleName ?: "<unknown>"
@@ -179,6 +180,12 @@ class AppLoadServiceImpl(private val projectFiles: ProjectFiles) : AppLoadServic
179180
return behaviorClasses
180181
}
181182

183+
private class ReloadingClassLoader(urls: Array<URL>, parent: ClassLoader) : URLClassLoader(urls, parent) {
184+
fun reloadClass(name: String): Class<*> {
185+
return findLoadedClass(name) ?: findClass(name)
186+
}
187+
}
188+
182189
companion object {
183190
private const val BUILD_GRADLE = "build.gradle.kts"
184191
private const val GRADLE_BUILD_TASK = "jvmMainClasses"

0 commit comments

Comments
 (0)