修复Vault依赖导致启动崩溃:BondManager获取也改用Class.forName反射

- setupEconomy(): 不再用getPluginManager().getPlugin()拿Main类(会触发Vault class loading)
- 改用Class.forName("Sdf1_login.Main") + 反射INSTANCE字段 + getBondManager()
- 原因:sdf1_login的Main.java import了Vault.Economy,任何反射其类的方法签名都会触发JVM加载所有引用的class
- 这和Sdf1_game BondBridge的修复原理一致,只是之前只在Sdf1_game上做了
This commit is contained in:
ypshidifu
2026-06-28 19:33:29 +08:00
parent 17ddc80c11
commit 05fb8ba71f
+20 -14
View File
@@ -568,22 +568,28 @@ public void onEnable() {
}
private void setupEconomy() {
// 优先使用 Sdf1_login 债券系统
// 优先使用 Sdf1_login 债券系统(完全反射,避免触发 Vault 类加载)
try {
org.bukkit.plugin.Plugin pl = Bukkit.getPluginManager().getPlugin("Sdf1_login");
if (pl != null && pl.isEnabled()) {
java.lang.reflect.Method m = pl.getClass().getMethod("getBondManager");
Object bm = m.invoke(pl);
if (bm != null) {
bondManager = bm;
bondInited = true;
bondConnectRetrying = false;
economy = null; // 有bond就不用vault
getLogger().info("[经济] 已连接 Sdf1_login 债券系统");
return;
}
// 用 Class.forName 而不是 getPlugin,这样只反射指定类而不扫描整个 Main
Class<?> mainClass = Class.forName("Sdf1_login.Main");
Object instance = mainClass.getField("INSTANCE").get(null);
java.lang.reflect.Method getBM = mainClass.getMethod("getBondManager");
Object bm = getBM.invoke(instance);
if (bm != null) {
bondManager = bm;
bondInited = true;
bondConnectRetrying = false;
economy = null; // 有bond就不用vault
getLogger().info("[经济] 已连接 Sdf1_login 债券系统");
return;
}
} catch (Exception ignored) {}
} catch (ClassNotFoundException e) {
// Sdf1_login 未安装
} catch (NoSuchFieldException e) {
// INSTANCE 字段不存在
} catch (Exception e) {
// 其他反射异常(包括 NoClassDefFoundError),忽略即可
}
// 其次检查是否已经在 onEnable 延迟初始化中连接了 bond
if (bondInited) {