public static void setMOTD(final String motd) throws Exception {
    final Field field = MinecraftServer.class.getDeclaredField("motd");
    final Field server = CraftServer.class.getDeclaredField("console");
    field.setAccessible(true);
    server.setAccessible(true);
    MinecraftServer instance = (MinecraftServer) server.get(CraftServer.class);
    field.set(instance, motd);
}


我的目标是在Minecraft服务器(运行craftbukkit)上更改每日消息。为此,我需要更改一个非静态字段motd。我使用插件来完成所有这些操作,因此无法获取MinecraftServer的实例。最后第二行是我尝试通过反射进行此操作,但是失败了。我无权更改MinecraftServer类或CraftServer,因为它们在外部库中。

motd和console都是非静态字段。

motd是带有修饰符public final的String。

控制台是MinecraftServer的实例,修饰符受保护为final。

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

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

最佳答案

重新读取该错误消息,似乎与您的代码不一致。该错误消息似乎表明您正在尝试将console成员变量设置为无效的对象类型。请确认您实际测试的代码。

关于java - 使用反射设置非静态场,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11605921/

10-10 19:24