Java-класс расширяет другой класс с помощью отражения (Bukkit) - PullRequest
0 голосов
/ 28 октября 2018

Я пытаюсь создать графический интерфейс Anvil для моего плагина Bukkit.Я пытаюсь сделать мой код кросс-версия совместимым.Однако класс 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;
}
}

1 Ответ

0 голосов
/ 28 октября 2018

К сожалению, вы не можете заставить класс наследовать от другого класса или интерфейса, используя отражение.

Однако вы можете изменить содержимое в пакете NMS (не рекомендуется) и использовать его вместо этого.

...