使用Field' s类型的子类设置字段的值

时间:2015-05-22 01:43:03

标签: java inheritance reflection casting bukkit

我一直在研究这个问题超过12个小时而没有成功,所以如果有人可以帮助解决这个问题或提供不同的解决方案,我将永远感激不尽。我遇到的主要问题是使用类继承结构更改字段,我将尝试解释:

" craftPlayer" variable是CraftPlayer的一个实例,它是CraftEntity的子类。 CraftEntity类包含一个Entity对象,该对象具有变量" 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;
}

2 个答案:

答案 0 :(得分:0)

你想在这做什么?

field.set(entity, entity);

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

field.set(craftPlayer, entity);

答案 1 :(得分:0)

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

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