Java 使用反射设置非静态字段

Java 使用反射设置非静态字段,java,minecraft,Java,Minecraft,我的目标是在minecraft服务器(运行craftbukkit)上更改当天的消息。要做到这一点,我需要改变一个非静态字段motd。我用一个插件来完成所有这些,所以我无法获得MinecraftServer的实例。最后一行是我尝试用反射来做这件事,但是失败了。我没有权限更改MinecraftServer类或CraftServer,因为它们位于外部库中 motd和console都是非静态字段 motd是一个带有修饰语public final的字符串 console是一个受修改器保护的Minecraf

我的目标是在minecraft服务器(运行craftbukkit)上更改当天的消息。要做到这一点,我需要改变一个非静态字段motd。我用一个插件来完成所有这些,所以我无法获得MinecraftServer的实例。最后一行是我尝试用反射来做这件事,但是失败了。我没有权限更改MinecraftServer类或CraftServer,因为它们位于外部库中

motd和console都是非静态字段

motd是一个带有修饰语public final的字符串

console是一个受修改器保护的MinecraftServer实例

这是我得到的错误(在setMOTD的最后第二行):


根据错误消息,现场控制台在CraftServer类中似乎标记为“final”

这意味着一旦设置,您将无法更改它,这将在反射获得修改它的机会之前发生


如果CraftServer是库的一部分,您可能无法更改此行为。根据错误消息,现场控制台在CraftServer类中似乎标记为“最终”

这意味着一旦设置,您将无法更改它,这将在反射获得修改它的机会之前发生


如果CraftServer是库的一部分,您可能无法更改此行为。重新读取错误消息时,它似乎与您的代码不一致。错误消息似乎暗示您正试图将
console
成员变量设置为无效的对象类型。请确认您实际测试的代码。

重新阅读错误消息,它似乎与您的代码不一致。错误消息似乎暗示您正试图将
console
成员变量设置为无效的对象类型。请确认您实际测试的代码。

通过获取扩展CraftServer的bukkit实例来解决

2012-07-22 22:16:31 [SEVERE] java.lang.IllegalArgumentException: Can not set final net.minecraft.server.MinecraftServer field org.bukkit.craftbukkit.CraftServer.console to java.lang.Class

通过获取扩展CraftServer的bukkit实例来解决此问题

2012-07-22 22:16:31 [SEVERE] java.lang.IllegalArgumentException: Can not set final net.minecraft.server.MinecraftServer field org.bukkit.craftbukkit.CraftServer.console to java.lang.Class

这似乎是我的问题,我正试图找到一个解决办法,但似乎没有任何工作。我将在未来向craftbukkit提交对github的拉动,但是我正在寻找一个带有反射的临时解决方案。(第一次使用反射)是的,在大多数情况下,你不能做太多的事情来覆盖这种行为。它的设计是为了防止程序员以不希望的方式使用库。必须有另一种方法来完成您的计划在新版本中有,但是我想支持大多数服务器,它们运行在旧版本的craftbukkit上,而旧版本的craftbukkit还不支持此功能。同样感谢您的快速回复:)嗯,仔细检查,看看它不是在某个属性中设置的配置项,如果它是一个属性,那么它似乎是理想的设置方式,但是我想在运行时为我的插件更改它,如本期所示:这似乎是我的问题,我试图找到一种方法来解决这个问题,但似乎没有任何效果。我将在未来向craftbukkit提交对github的拉动,但是我正在寻找一个带有反射的临时解决方案。(第一次使用反射)是的,在大多数情况下,你不能做太多的事情来覆盖这种行为。它的设计是为了防止程序员以不希望的方式使用库。必须有另一种方法来完成您的计划在新版本中有,但是我想支持大多数服务器,它们运行在旧版本的craftbukkit上,而旧版本的craftbukkit还不支持此功能。同样感谢您的快速回复:)嗯,仔细检查,看看它是否不是在某个属性中设置的配置项,如果它是属性,似乎是理想的设置方式,但是我想在运行时为我的插件更改它,如本期所示:这样做可以吗?字段修饰符字段=Field.class.getDeclaredField(“修饰符”);modifiersField.setAccessible(true);setInt(服务器,field.getModifiers()&~Modifier.FINAL);我似乎仍然得到了同样的错误(在例外情况下没有最后的修饰符)。这是工作吗?字段修饰符字段=Field.class.getDeclaredField(“修饰符”);modifiersField.setAccessible(true);setInt(服务器,field.getModifiers()&~Modifier.FINAL);尽管如此,我似乎仍然得到了相同的错误(在异常中没有最后的修饰符)。
    public static void setServerMOTD(final String motd) throws Exception {
    final Field field = MinecraftServer.class.getDeclaredField("motd");
    final Field server = CraftServer.class.getDeclaredField("console");
    Field modifiersField = Field.class.getDeclaredField("modifiers");
    modifiersField.setAccessible(true);
    field.setAccessible(true);
    server.setAccessible(true);
    modifiersField.setInt(server, server.getModifiers() & ~Modifier.FINAL);
    MinecraftServer instance = (MinecraftServer) server.get(Bukkit.getServer());
    field.set(instance, motd);
}