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

设置共享身份
每个 Fluxon 运行时实例在导出前需要设置身份标识,用于区分函数来源:导出函数
方式 1:直接导出 MethodHandle
方式 2:导出已注册的函数
方式 3:ExtensionBuilder 一步注册 + 导出
方式 4:@Export 注解自动导出
ExportRegistry.registerClass() 扫描到 shared = true 的方法时,会自动注册到全局共享注册表(前提是 sharingIdentity 已设置)。
导入函数
NativeFunction,可通过 Fluxon.eval() 或 Environment 正常调用。
显式查找(不自动注册)
NativeFunction 实例,但不注册到本地运行时。适用于一次性调用或条件导入。
插件卸载
在插件onDisable 中调用,移除所有已导出的共享函数:
版本安全
共享条目使用版本化协议(当前 v1)。当遇到更高版本的条目时:- 不会在导入时崩溃 — 返回一个 stub 函数
- 调用时抛出
UnsupportedOperationException,包含版本差异的详细提示 - 低版本读取高版本条目时,安全忽略末尾多余字段
版本演进规则
entry[0]永远是版本号,位置不变- 新版本只能在
Object[]末尾追加字段,不能修改已有字段 - 所有元素类型必须来自
java.base(避免 ClassLoader 隔离问题)
性能特征
跨 ClassLoader 调用通过MethodHandle.invokeWithArguments() + Object[] 装箱,单次调用约 15-30ns 开销。适用于跨插件 API 调用(冷路径)。
对于热路径函数,建议使用源码级共享(本地 parse/compile)。