使用字段类型的子类设置字段的值



我已经在这个问题上工作了超过12个小时,但没有成功,所以如果有人可以帮助我解决这个问题或提供不同的解决方案,我将永远感激。我遇到的主要问题是改变类继承结构的字段,我将尝试解释:

"craftPlayer"变量是一个crafplayer的实例,它是CraftEntity的子类。CraftEntity类包含一个实体对象,它的变量是"uniqueID"。所以基本上我要做的就是改变"craftPlayer"的唯一id变量。我没有访问任何类,所以我使用反射。我目前遇到的问题是试图改变"craftPlayer"内部的实体变量,但我无法找到一种方法来获得该类的实例,因为"实体"变量实际上是EntityPlayer的实例,而不是实体

我知道这个解释得很糟糕,所以问尽可能多的问题来澄清。如有任何帮助,不胜感激。

        CraftEntity craftPlayer = (CraftEntity) player;
        @SuppressWarnings("unchecked")
        Class<CraftEntity> craftEntityClass = getCraftEntityClass((Class<CraftEntity>) craftPlayer.getClass());
        for (Field field : craftEntityClass.getDeclaredFields()) {
            field.setAccessible(true);
            if (field.getName().equals("entity")) {
                Object object = field.get(craftPlayer);
                EntityPlayer entity = (EntityPlayer) object;
                entity.uniqueID = new UUID(0L, 0L);
                field.set(entity, entity); //"entity" is really an instance of EntityPlayer which is a subclass of Entity so i am unable to change the field because upclassing does not seem to work
                break;
            }
        }
编辑:

下面是CraftEntity类,以更好地显示我在做什么

public abstract class CraftEntity implements org.bukkit.entity.Entity {   
    protected final CraftServer server;
    protected net.minecraft.server.v1_5_R3.Entity entity;
    private EntityDamageEvent lastDamageEvent;
}

entity.uniqueID = new UUID(0L, 0L);足以改变变量。尝试将字段设置为新变量是多余的。

问题实际上是时间,这段代码在玩家保存的数据被加载之前被调用,所以一旦它被我所做的更改被覆盖。

你到底想干什么?

field.set(entity, entity);

如果你想改变"craftPlayer"对象中的字段,你不应该这样做吗?

field.set(craftPlayer, entity);

相关内容

  • 没有找到相关文章

最新更新