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 のインスタンスを取得できません。最後から 2 番目の行は、リフレクションを使用してこれを実行しようとした私の試みでしたが、失敗しました。外部ライブラリにあるため、MinecraftServer クラスまたは CraftServer を変更するアクセス権がありません。
motd と console はどちらも非静的フィールドです。
motd は修飾子 public final を持つ文字列です。
console は、modifiers protected final を持つ MinecraftServer のインスタンスです。
これは私が得ているエラーです(setMOTDの最後の2行目):
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