Skip to main content
支持不同 ClassLoader 中的 Fluxon 运行时实例之间共享普通函数和扩展函数。典型场景:Bukkit 服务器中多个插件间共享脚本函数。

原理

使用 System.getProperties() 作为 JVM 全局单例锚点,存储 MethodHandle + 元数据的版本化 Object[] 元组。所有元素类型均来自 java.base,天然跨 ClassLoader 可见。 跨 ClassLoader 函数共享架构

设置共享身份

每个 Fluxon 运行时实例在导出前需要设置身份标识,用于区分函数来源:

导出函数

方式 1:直接导出 MethodHandle

方式 2:导出已注册的函数

方式 3:ExtensionBuilder 一步注册 + 导出

方式 4:@Export 注解自动导出

ExportRegistry.registerClass() 扫描到 shared = true 的方法时,会自动注册到全局共享注册表(前提是 sharingIdentity 已设置)。

导入函数

导入后的函数注册为本地 NativeFunction,可通过 Fluxon.eval()Environment 正常调用。

显式查找(不自动注册)

返回适配后的 NativeFunction 实例,但不注册到本地运行时。适用于一次性调用或条件导入。

插件卸载

在插件 onDisable 中调用,移除所有已导出的共享函数:

版本安全

共享条目使用版本化协议(当前 v1)。当遇到更高版本的条目时:
  • 不会在导入时崩溃 — 返回一个 stub 函数
  • 调用时抛出 UnsupportedOperationException,包含版本差异的详细提示
  • 低版本读取高版本条目时,安全忽略末尾多余字段

版本演进规则

  1. entry[0] 永远是版本号,位置不变
  2. 新版本只能在 Object[] 末尾追加字段,不能修改已有字段
  3. 所有元素类型必须来自 java.base(避免 ClassLoader 隔离问题)

性能特征

跨 ClassLoader 调用通过 MethodHandle.invokeWithArguments() + Object[] 装箱,单次调用约 15-30ns 开销。适用于跨插件 API 调用(冷路径)。 对于热路径函数,建议使用源码级共享(本地 parse/compile)。

完整生命周期示例

相关链接