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