NMS Bridgev1.0.0已發布
NMS 反射橋接器
NMS Reflection Bridge
透過 MethodHandle 快取存取 NMS,不需 Paperweight 編譯依賴,同一 JAR 可在多個 MC 版本執行。
nmsreflectionmethod-handlecross-versionno-paperweight
更新:2026年4月19日GitHub
NMS Reflection Bridge
目的
提供不依賴 Paperweight userdev 的 NMS 存取方式,透過 Java reflection 與 MethodHandle 快取取得跨版本相容性。適用於需要在多個 MC 版本發佈的 plugin。
若只需單一版本,優先使用 Paperweight 原生 API(更簡潔、型別安全)。
平台需求
- Paper 1.20.5+(原生使用 Mojang mappings,無需 remap)
- 不需 Paperweight 編譯依賴
- 僅需
paper-api或spigot-api
產生的代碼
MethodHandleCache.java
public final class MethodHandleCache {
private static final Map<String, MethodHandle> METHOD_CACHE = new ConcurrentHashMap<>();
public static MethodHandle method(Class<?> owner, String name, Class<?>... params) {
return METHOD_CACHE.computeIfAbsent(key, k -> {
Method m = owner.getDeclaredMethod(name, params);
m.setAccessible(true);
return LOOKUP.unreflect(m);
});
}
public static MethodHandle fieldGetter(Class<?> owner, String name) {
// 類似 method(),回傳 field getter handle
}
}
NmsBridge.java
// 取得 NMS ServerPlayer
Object nmsPlayer = NmsBridge.getHandle(player);
// 發送封包(反射呼叫 connection.send)
NmsBridge.sendPacket(player, nmsPacket);
// 動態建立 NMS 物件
Object packet = NmsBridge.newInstance("net.minecraft.network.protocol.game.ClientboundSetActionBarTextPacket");
執行緒安全
MethodHandleCache使用ConcurrentHashMap,多執行緒安全MethodHandle本身執行緒安全,可跨執行緒重用- 反射呼叫的 NMS 方法仍需遵守主執行緒規則