由继承 JavaPlugin
的插件主类在 static
块中启动 IsolatedClassLoader
(下文简称:沙盒)
public class TestPlugin extends JavaPlugin {
static {
IsolatedClassLoader.init(TestPlugin.class);
}
}
随后由 沙盒 加载 PrimitiveLoader
并启动。
public class IsolatedClassLoader {
// ...
public static void init(Class<?> clazz) {
// 初始化隔离类加载器
INSTANCE = new IsolatedClassLoader(clazz);
// 加载启动类
try {
Class<?> delegateClass = Class.forName("taboolib.common.PrimitiveLoader", true, INSTANCE);
Object delegateObject = delegateClass.getConstructor().newInstance();
delegateClass.getMethod("init").invoke(delegateObject);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
// ...
}
原始启动阶段即下载完整模块过程。
- 首先,由
PrimitiveLoader
下载jar-relocator
核心重定向工具,并载入沙盒。 - 其次,由
PrimitiveLoader
下载项目所需要的所有 TabooLib 模块,并借助jar-relocate
重定向后加载。
优先下载
jar-relocator
是先决条件,虽有沙盒环境但存在多种限制,因此 TabooLib 项目依旧保留了重定向传统。
经过 PrimitiveLoader
下载的模块会执行 extra.properties
中指向的入口函数。
main=common.env.RuntimeEnv
main-method=init
main=common.inject.VisitorHandler,common.io.ProjectScannerKt
main-method=init
模块的下载存在必要的先后顺序:
common-env
模块优先加载,用于启动 Kotlin 环境。common-util
模块在 Kotlin 环境就绪后加载,注册ClassAppender Callback
回调函数。
后续模块的加载无先后顺序。
由继承 JavaPlugin
的插件主类在 static
块中运行 TabooLib#lifeCycle
生命周期函数。
static {
// ...
TabooLib.lifeCycle(LifeCycle.CONST);
}
此时 TabooLib 基本加载完成,但依旧需要在 onLoad
, onEnable
, onDisable
等函数中运行生命周期函数。
相比 6.0
版本,虽然解体后的 TabooLib 在加载逻辑上稍显复杂,但 common
模块在经历重构后变得更加清晰。
jar-relocator
->env
->kotlin
->ALL