refactor(extension): 改进 ExtensionClassLoader 的构造器.

将构造器改进后, 在使用过程中会更加灵活.
This commit is contained in:
LamGC 2022-02-15 14:06:45 +08:00
parent 36ab898520
commit 5556613087
Signed by: LamGC
GPG Key ID: 6C5AE2A913941E1D

View File

@ -356,15 +356,27 @@ internal object MavenMetaInformationFinder : ExtensionPackageFinder {
/** /**
* 扩展包专属的类加载器. * 扩展包专属的类加载器.
* *
* 通过为每个扩展包提供专门的加载器, 可防止意外使用其他扩展的类(希望如此). * 通过为每个扩展包提供专有的加载器, 可防止意外使用其他扩展的类(希望如此).
* @param urls 扩展包资源 Url.
*/ */
internal class ExtensionClassLoader(extensionFile: File) : internal class ExtensionClassLoader(vararg urls: URL) :
URLClassLoader(arrayOf(URL("file:///${extensionFile.canonicalPath}"))) { URLClassLoader(urls) {
/**
* 指定扩展包 File 来创建 ClassLoader.
* @param extensionFile 扩展包文件.
*/
constructor(extensionFile: File) :
this(URL(getUrlString(extensionFile)))
val serviceLoader: ServiceLoader<BotExtensionFactory> = ServiceLoader.load(BotExtensionFactory::class.java, this) val serviceLoader: ServiceLoader<BotExtensionFactory> = ServiceLoader.load(BotExtensionFactory::class.java, this)
companion object {
private fun getUrlString(extensionFile: File, defaultScheme: String = "file:///"): String {
return when (extensionFile.extension.lowercase()) {
"jar" -> "jar:file:///${extensionFile.canonicalPath}!/"
else -> defaultScheme + extensionFile.canonicalPath
}
}
}
} }