From 05fb8ba71ffcf4ea042843c3ebc0cf8a0c0142f6 Mon Sep 17 00:00:00 2001 From: ypshidifu Date: Sun, 28 Jun 2026 19:33:29 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DVault=E4=BE=9D=E8=B5=96?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=E5=90=AF=E5=8A=A8=E5=B4=A9=E6=BA=83=EF=BC=9A?= =?UTF-8?q?BondManager=E8=8E=B7=E5=8F=96=E4=B9=9F=E6=94=B9=E7=94=A8Class.f?= =?UTF-8?q?orName=E5=8F=8D=E5=B0=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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上做了 --- src/main/java/com/CY/Main.java | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/CY/Main.java b/src/main/java/com/CY/Main.java index 6f8daba..128299f 100644 --- a/src/main/java/com/CY/Main.java +++ b/src/main/java/com/CY/Main.java @@ -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) {