@@ -17,6 +17,7 @@ import kotlinx.coroutines.CoroutineScope
1717import kotlinx.coroutines.Job
1818import java.io.BufferedReader
1919import java.io.InputStreamReader
20+ import java.net.URL
2021import java.net.URLClassLoader
2122import java.nio.file.Path
2223import 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