setupEconomy修复: 改用Bukkit获取实例(原INSTANCE字段不存在)\n\n- 移除Class.forName+getField INSTANCE\n- setupEconomy: 用Bukkit.getPluginManager().getPlugin().getClass().getMethod\n- invokeBond重连: 同样改用getBonds()反射,不再遍历getDeclaredFields

This commit is contained in:
ypshidifu
2026-06-29 11:05:21 +08:00
parent 05fb8ba71f
commit dc697b8a78
+27 -37
View File
@@ -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) {}