BondBridge修复: 改用Bukkit.getPluginManager()获取实例(原INSTANCE字段不存在)\n\n- 移除Class.forName+getField INSTANCE( Main没有静态INSTANCE字段)\n- 改用Bukkit.getPluginManager().getPlugin获取已加载实例\n- getBonds()方法通过sdf1Plugin.getClass().getMethod反射调用
This commit is contained in:
@@ -1,5 +1,7 @@
|
|||||||
package Sdf1_game;
|
package Sdf1_game;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
|
||||||
public class BondBridge {
|
public class BondBridge {
|
||||||
|
|
||||||
private Object bondManager;
|
private Object bondManager;
|
||||||
@@ -7,55 +9,45 @@ public class BondBridge {
|
|||||||
private boolean hooked = false;
|
private boolean hooked = false;
|
||||||
|
|
||||||
public boolean hook(Main plugin) {
|
public boolean hook(Main plugin) {
|
||||||
|
// Sdf1_login 已经加载完毕,直接通过 Bukkit 获取实例
|
||||||
|
// (Sdf1_login.Main 的 Vault import 不会在这里触发 class loading,
|
||||||
|
// 因为我们只调用 getMethod 反射,不会解析 Main 的字段签名)
|
||||||
try {
|
try {
|
||||||
// 使用 Class.forName 避免 JVM 直接加载 Sdf1_login.Main.class
|
org.bukkit.plugin.Plugin pl = Bukkit.getPluginManager().getPlugin("Sdf1_login");
|
||||||
// 如果 Main 中有 Vault import,直接 getClassLoader().loadClass 会导致 NoClassDefFoundError
|
if (pl == null || !pl.isEnabled()) {
|
||||||
Class<?> mainClass = Class.forName("Sdf1_login.Main");
|
plugin.getLogger().warning("[快问快答] 未找到Sdf1_login,债券奖励不可用");
|
||||||
sdf1Plugin = mainClass.getField("INSTANCE").get(null);
|
return false;
|
||||||
} catch (ClassNotFoundException e) {
|
}
|
||||||
plugin.getLogger().warning(
|
sdf1Plugin = pl;
|
||||||
"[快问快答] 未找到Sdf1_login类,债券奖励不可用");
|
|
||||||
return false;
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
plugin.getLogger().warning(
|
plugin.getLogger().warning("[快问快答] 获取Sdf1_login实例失败: " + e.getMessage());
|
||||||
"[快问快答] 获取Sdf1_login实例失败: " + e.getMessage());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sdf1Plugin == null) {
|
|
||||||
plugin.getLogger().warning(
|
|
||||||
"[快问快答] Sdf1_login 实例为空");
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
bondManager = findManager();
|
bondManager = findManager();
|
||||||
if (bondManager == null) {
|
if (bondManager == null) {
|
||||||
plugin.getLogger().warning(
|
plugin.getLogger().warning("[快问快答] 找不到BondManager");
|
||||||
"[快问快答] 找不到BondManager");
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
hooked = true;
|
hooked = true;
|
||||||
plugin.getLogger().info(
|
plugin.getLogger().info("[快问快答] 债券桥接成功");
|
||||||
"[快问快答] 债券桥接成功");
|
|
||||||
return true;
|
return true;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
plugin.getLogger().warning(
|
plugin.getLogger().warning("[快问快答] 桥接失败: " + e.getMessage());
|
||||||
"[快问快答] 桥接失败: " + e.getMessage());
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询玩家当前债券余额
|
* 查询玩家当前债券余额
|
||||||
* 使用反射避免触发 Vault class loading
|
|
||||||
*/
|
*/
|
||||||
public int getBonds(String playerName) {
|
public int getBonds(String playerName) {
|
||||||
if (!isHooked() || sdf1Plugin == null) return 0;
|
if (!isHooked() || sdf1Plugin == null) return 0;
|
||||||
try {
|
try {
|
||||||
Class<?> mainClass = Class.forName("Sdf1_login.Main");
|
java.lang.reflect.Method getBM = sdf1Plugin.getClass().getMethod("getBonds");
|
||||||
java.lang.reflect.Method getBM = mainClass.getMethod("getBondManager");
|
|
||||||
Object bm = getBM.invoke(sdf1Plugin);
|
Object bm = getBM.invoke(sdf1Plugin);
|
||||||
|
if (bm == null) return 0;
|
||||||
|
|
||||||
java.lang.reflect.Method getBondsM = bm.getClass()
|
java.lang.reflect.Method getBondsM = bm.getClass()
|
||||||
.getMethod("getBonds", String.class);
|
.getMethod("getBonds", String.class);
|
||||||
@@ -66,17 +58,15 @@ public class BondBridge {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* findManager: 尝试多种方式获取 BondManager 实例
|
* findManager: 尝试多种方式获取 BondManager 实例
|
||||||
* 完全使用反射,避免触发 Main.class 的 Vault 依赖
|
|
||||||
*/
|
*/
|
||||||
private Object findManager() throws Exception {
|
private Object findManager() throws Exception {
|
||||||
Class<?> mainClass = Class.forName("Sdf1_login.Main");
|
Class<?> mainClass = sdf1Plugin.getClass();
|
||||||
|
|
||||||
// 策略1: getBondManager() 方法
|
// 策略1: getBondManager() 方法
|
||||||
try {
|
try {
|
||||||
java.lang.reflect.Method m = mainClass.getMethod("getBondManager");
|
java.lang.reflect.Method m = mainClass.getMethod("getBonds");
|
||||||
Object r = m.invoke(sdf1Plugin);
|
Object r = m.invoke(sdf1Plugin);
|
||||||
if (r != null) return r;
|
if (r != null) return r;
|
||||||
} catch (NoSuchMethodException ignored) {
|
} catch (NoSuchMethodException ignored) {
|
||||||
|
|||||||
Reference in New Issue
Block a user