java - 使用反射设置非静态字段

标签 java minecraft

    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 的实例。倒数第二行是我尝试通过反射(reflection)来做到这一点,但它失败了。我无权更改 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

最佳答案

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

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

相关文章:

java - 使用 java 的 XSLT 1.0 中的正则表达式

java - 带有调用电子邮件和短信功能的弹出窗口

java - 使用 DateFormat 将字符串转换为日期

java - onCommand() 设置正确但根本没有执行

java - 调用静态 Void 方法

java - 比较法违反了它的一般契约。简单比较

python - 如何在Python 2.7中写入正在运行的程序的另一个终端?

java - 如何让JPanel填满整个JFrame?

Java 无法为对象堆保留足够的空间

Java向我的世界服务器发送握手包