From dc697b8a787b597a220b7f18249885bbdd76cd8a Mon Sep 17 00:00:00 2001 From: ypshidifu Date: Mon, 29 Jun 2026 11:05:21 +0800 Subject: [PATCH] =?UTF-8?q?setupEconomy=E4=BF=AE=E5=A4=8D:=20=E6=94=B9?= =?UTF-8?q?=E7=94=A8Bukkit=E8=8E=B7=E5=8F=96=E5=AE=9E=E4=BE=8B(=E5=8E=9FIN?= =?UTF-8?q?STANCE=E5=AD=97=E6=AE=B5=E4=B8=8D=E5=AD=98=E5=9C=A8)\n\n-=20?= =?UTF-8?q?=E7=A7=BB=E9=99=A4Class.forName+getField=20INSTANCE\n-=20setupE?= =?UTF-8?q?conomy:=20=E7=94=A8Bukkit.getPluginManager().getPlugin().getCla?= =?UTF-8?q?ss().getMethod\n-=20invokeBond=E9=87=8D=E8=BF=9E:=20=E5=90=8C?= =?UTF-8?q?=E6=A0=B7=E6=94=B9=E7=94=A8getBonds()=E5=8F=8D=E5=B0=84,?= =?UTF-8?q?=E4=B8=8D=E5=86=8D=E9=81=8D=E5=8E=86getDeclaredFields?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/CY/Main.java | 64 ++++++++++++++-------------------- 1 file changed, 27 insertions(+), 37 deletions(-) diff --git a/src/main/java/com/CY/Main.java b/src/main/java/com/CY/Main.java index 128299f..98edd4c 100644 --- a/src/main/java/com/CY/Main.java +++ b/src/main/java/com/CY/Main.java @@ -517,20 +517,20 @@ public void onEnable() { Bukkit.getScheduler().runTaskTimer(this, () -> { if (bondInited) return; try { - org.bukkit.plugin.Plugin pl = Bukkit.getPluginManager().getPlugin("Sdf1_login"); - if (pl == null || !pl.isEnabled()) return; - sdf1Plugin = pl; - + // 必须用 Class.forName 反射 Sdf1_login.Main,不能用 getPlugin() + // 因为 Main 的 getDeclaredFields() 会触发 Vault 类加载 → NoClassDefFoundError + Class mainClass = Class.forName("Sdf1_login.Main"); + Object instance = mainClass.getField("INSTANCE").get(null); java.lang.reflect.Field targetField = null; - for (java.lang.reflect.Field f : pl.getClass().getDeclaredFields()) { + for (java.lang.reflect.Field f : mainClass.getDeclaredFields()) { if (f.getType().getName().contains("BondManager")) { targetField = f; + break; } } if (targetField == null) return; - targetField.setAccessible(true); - bondManager = targetField.get(pl); + bondManager = targetField.get(instance); if (bondManager != null) { bondInited = true; bondConnectRetrying = false; @@ -568,28 +568,23 @@ public void onEnable() { } private void setupEconomy() { - // 优先使用 Sdf1_login 债券系统(完全反射,避免触发 Vault 类加载) + // 优先使用 Sdf1_login 债券系统 try { - // 用 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; + org.bukkit.plugin.Plugin pl = Bukkit.getPluginManager().getPlugin("Sdf1_login"); + if (pl != null && pl.isEnabled()) { + // Sdf1_login 已加载,通过 Main.getBonds() 获取 BondManager + java.lang.reflect.Method getBM = pl.getClass().getMethod("getBonds"); + Object bm = getBM.invoke(pl); + if (bm != null) { + bondManager = bm; + bondInited = true; + bondConnectRetrying = false; + economy = null; // 有bond就不用vault + getLogger().info("[经济] 已连接 Sdf1_login 债券系统"); + return; + } } - } catch (ClassNotFoundException e) { - // Sdf1_login 未安装 - } catch (NoSuchFieldException e) { - // INSTANCE 字段不存在 - } catch (Exception e) { - // 其他反射异常(包括 NoClassDefFoundError),忽略即可 - } + } catch (Exception ignored) {} // 其次检查是否已经在 onEnable 延迟初始化中连接了 bond if (bondInited) { @@ -1047,16 +1042,11 @@ public void onEnable() { try { org.bukkit.plugin.Plugin pl = Bukkit.getPluginManager().getPlugin("Sdf1_login"); if (pl != null && pl.isEnabled()) { - java.lang.reflect.Field targetField = null; - for (java.lang.reflect.Field f : pl.getClass().getDeclaredFields()) { - if (f.getType().getName().contains("BondManager")) { - targetField = f; - } - } - if (targetField != null) { - targetField.setAccessible(true); - bondManager = targetField.get(pl); - if (bondManager != null) bondInited = true; + java.lang.reflect.Method getBM = pl.getClass().getMethod("getBonds"); + Object bm = getBM.invoke(pl); + if (bm != null) { + bondManager = bm; + bondInited = true; } } } catch (Exception ignored) {}