java - Java 类使用反射扩展另一个类 (bukkit)
问题描述
我正在尝试为我的 bukkit 插件制作 Anvil GUI。我正在尝试使我的代码跨版本兼容。但是该类FakeAnvil
需要扩展该类ContainerAnvil
,并且该类在NMS包中...有什么方法可以通过反射扩展该类吗?
这是我的代码:
package me.raymondliu1;
import java.lang.reflect.Constructor;
import org.bukkit.Bukkit;
//These five import is making the plugin not cross-version compatible
import net.minecraft.server.v1_8_R1.BlockPosition;
import net.minecraft.server.v1_8_R1.ContainerAnvil;
import net.minecraft.server.v1_8_R1.EntityHuman;
import net.minecraft.server.v1_8_R1.PlayerInventory;
import net.minecraft.server.v1_8_R1.World;
//problem 1
public final class FakeAnvil extends ContainerAnvil {
static Class<?> entityHumanClass;
static Class<?> BlockPositionClass;
static Class<?> ContainerAnvilClass;
static Constructor<?> bpc;
static Constructor<?> cac;
static{
try {
entityHumanClass = getNMSClass("EntityHuman");
BlockPositionClass = getNMSClass("BlockPosition");
ContainerAnvilClass = getNMSClass("ContainerAnvil");
cac = ContainerAnvilClass.getConstructor(PlayerInventory.class,World.class,BlockPositionClass,entityHumanClass);
bpc = BlockPositionClass.getConstructor(int.class,int.class,int.class);
} catch (ClassNotFoundException | NoSuchMethodException | SecurityException e) {
e.printStackTrace();
}
}
private static Class<?> getNMSClass(String nmsClassString) throws ClassNotFoundException {
String version = Bukkit.getServer().getClass().getPackage().getName().replace(".", ",").split(",")[3] + ".";
String name = "net.minecraft.server." + version + nmsClassString;
Class<?> nmsClass = Class.forName(name);
return nmsClass;
}
public FakeAnvil(Object entityHuman) throws Exception {
//Problem 2
super((PlayerInventory)entityHumanClass.getField("inventory").get(entityHuman), (World)entityHumanClass.getField("inventory").get("world"), (BlockPosition)bpc.newInstance(0,0,0), (EntityHuman)entityHuman);
}
@Override
public boolean a(EntityHuman entityHuman) {
return true;
}
}
解决方案
不幸的是,您不能使用反射使一个类从另一个类或接口继承。
但是,您可以修改 NMS 包中的内容(不推荐)并使用它。
推荐阅读
- python - Python打印乱序
- opencv - 从实时网络摄像头源中裁剪头部和上半身
- visual-studio-code - Visual Studio Code 扩展消失了
- node.js - 如何使用nodejs仅压缩具有不同扩展名的文件夹中的html文件
- google-compute-engine - 欧洲 N2D/C2 配额
- ios - 使用 Dictionary(uniqueKeysWithValues:) 在 Swift 5 中转换字典键类型
- ios - 为什么 Xcode 找不到我的单元测试应用程序?
- python - 参数必须是 int 或 float
- python - 从深度嵌套的字典中选择条目
- javascript - Javascript:需要表单单元格来匹配