resolve conversation changes

This commit is contained in:
Sincky 2020-04-05 15:56:47 +08:00
parent 224255fd0f
commit a541289942

View File

@ -3,15 +3,15 @@ package net.mamoe.mirai.console.plugins
import java.io.File
import java.net.URLClassLoader
class PluginsClassLoader(parent: ClassLoader) : ClassLoader(parent) {
private val pluginLoaders = mutableMapOf<String,PluginClassLoader>()
internal class PluginsClassLoader(parent: ClassLoader) : ClassLoader(parent) {
private val pluginLoaders = mutableMapOf<String, PluginClassLoader>()
/**
* 加载多个插件
*/
fun loadPlugins(pluginsLocation: Map<String, File>) {
for((key, value) in pluginsLocation){
pluginLoaders[key] = PluginClassLoader(value,this)
for ((key, value) in pluginsLocation) {
pluginLoaders[key] = PluginClassLoader(value, this)
}
}
@ -29,57 +29,49 @@ class PluginsClassLoader(parent: ClassLoader) : ClassLoader(parent) {
/**
* 移除单个插件加载器
*/
fun remove(pluginName: String){
pluginLoaders[pluginName]!!.close()
fun remove(pluginName: String): Boolean {
pluginLoaders[pluginName]?.close() ?: return false
pluginLoaders.remove(pluginName)
return true
}
override fun loadClass(name: String): Class<*>? {
var c : Class<*>? = null
var c: Class<*>? = null
// 循环插件classloader loadClass
pluginLoaders.map {
try {
c = it.value.loadClass(name)
return@map
}catch (e: Throwable){
pluginLoaders.values.forEach {
it.runCatching {
c = this.loadClass(name)
return@forEach
}
}
// 如果为null交给mirai的classloader进行加载
if(c==null){
if (c == null) {
c = parent.loadClass(name) // 如果无法加载这个类,这里会抛异常
}
return c
}
fun loadDependClass(name: String) : Class<*>? {
var c : Class<*>? = null
fun loadDependClass(name: String): Class<*>? {
var c: Class<*>? = null
// 依赖问题先交给mirai ClassLoader来处理
try {
runCatching {
c = parent.loadClass(name)
}catch (e : Throwable){
}
}
// 如果mirai加载不了依赖则交给插件的classloader进行加载
if(c==null){
pluginLoaders.map {
try {
c = it.value.loadDependClass(name)
return@map
}catch (e: Throwable){
if (c == null) {
pluginLoaders.values.forEach {
it.runCatching {
c = this.loadDependClass(name)
return@forEach
}
}
}
return c
}
}
class PluginClassLoader(files: File, parent: PluginsClassLoader?) :
URLClassLoader(arrayOf((files.toURI().toURL())),parent) {
internal class PluginClassLoader(files: File, parent: PluginsClassLoader?) :
URLClassLoader(arrayOf((files.toURI().toURL())), parent) {
override fun loadClass(name: String): Class<*>? {
synchronized(getClassLoadingLock(name)) {
@ -87,10 +79,10 @@ class PluginClassLoader(files: File, parent: PluginsClassLoader?) :
var c = findLoadedClass(name)
if (c == null) {
c = try {
// 自己加载
// 自己尝试加载
this.findClass(name) //ClassNotFoundException
} catch (e: ClassNotFoundException) {
// 交给父类去加载依赖
// 交给父类去加载非本插件的依赖
(this.parent as PluginsClassLoader).loadDependClass(name)
}
}
@ -102,8 +94,8 @@ class PluginClassLoader(files: File, parent: PluginsClassLoader?) :
synchronized(getClassLoadingLock(name)) {
var c = findLoadedClass(name)
if (c == null) {
// 加载依赖类,没有返回null
c = this.findClass(name) // 这里会丢ClassNotFoundException
// 加载依赖类,没有则丢出异常
c = this.findClass(name) // ClassNotFoundException
}
return c
}