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);
}
我的目标是更改我的世界服务器上的每日消息(运行craftbukkit)。为此,我需要更改一个非静态字段 motd。我正在使用插件完成所有这些操作,因此无法获取 MinecraftServer 的实例。最后第二行是我尝试通过反射来做到这一点,但它失败了。我无权更改 MinecraftServer 类或 CraftServer,因为它们位于外部库中。
motd 和 console 都是非静态字段。
motd 是一个带有修饰符 public final 的字符串。
console 是 MinecraftServer 的一个实例,带有修饰符 protected 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