使用字段类型的子类设置字段的值
Setting the Value of a Field With a Subclass of the Field's type
我已经在这个问题上工作了 12 个多小时但没有成功,所以如果有人可以帮助解决这个问题或提供不同的解决方案,我将永远感激不已。 运行 遇到的主要问题是使用 class 继承结构更改字段,我将尝试解释:
"craftPlayer" 变量是 CraftPlayer 的一个实例,它是 CraftEntity 的子 class。 CraftEntity class 包含一个具有变量 "uniqueID" 的实体对象。所以基本上我要做的就是更改 "craftPlayer" 的 uniqueID 变量。我无权访问任何 classes,所以我正在使用反射。我 运行 目前遇到的问题是试图更改 "craftPlayer" 中的 Entity 变量,但我无法找到一种方法来获取 class 的实例作为"entity" 变量实际上是 EntityPlayer 的实例而不是 Entity
我意识到这解释得非常糟糕,所以想问多少就问多少。任何帮助将不胜感激。
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 class 以更好地展示我在做什么
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;
}
你想在这里做什么?
field.set(entity, entity);
如果您想更改 "craftPlayer" 对象中的字段,您不应该这样做吗?
field.set(craftPlayer, entity);
entity.uniqueID = new UUID(0L, 0L);
足以改变变量。
尝试将字段设置为新变量是多余的。
问题实际上是时间问题,这段代码是在玩家保存的数据加载之前被调用的,所以我所做的更改一旦被覆盖。
我已经在这个问题上工作了 12 个多小时但没有成功,所以如果有人可以帮助解决这个问题或提供不同的解决方案,我将永远感激不已。 运行 遇到的主要问题是使用 class 继承结构更改字段,我将尝试解释:
"craftPlayer" 变量是 CraftPlayer 的一个实例,它是 CraftEntity 的子 class。 CraftEntity class 包含一个具有变量 "uniqueID" 的实体对象。所以基本上我要做的就是更改 "craftPlayer" 的 uniqueID 变量。我无权访问任何 classes,所以我正在使用反射。我 运行 目前遇到的问题是试图更改 "craftPlayer" 中的 Entity 变量,但我无法找到一种方法来获取 class 的实例作为"entity" 变量实际上是 EntityPlayer 的实例而不是 Entity
我意识到这解释得非常糟糕,所以想问多少就问多少。任何帮助将不胜感激。
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 class 以更好地展示我在做什么
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;
}
你想在这里做什么?
field.set(entity, entity);
如果您想更改 "craftPlayer" 对象中的字段,您不应该这样做吗?
field.set(craftPlayer, entity);
entity.uniqueID = new UUID(0L, 0L);
足以改变变量。
尝试将字段设置为新变量是多余的。
问题实际上是时间问题,这段代码是在玩家保存的数据加载之前被调用的,所以我所做的更改一旦被覆盖。