修复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:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user