在运行时使用bytebuddy覆盖另一个类内的静态类的方法

时间:2019-06-24 13:37:28

标签: java minecraft nms

我正在开发一个小的个人API,以便能够通过spigot(用于创建插件的修改后的服务器)自定义Minecraft服务器列表ping。 https://wiki.vg/Server_List_Ping

问题在于,每个版本的spigot软件包都更改了名称,我必须避免创建许多做相同事情的不同类。为了实现我的目标,我必须创建一个以ServerPing对象初始化的PacketStatusOutServerInfo对象。这个部分混淆的ServerPing对象由不同的类组成,这些类具有用于构建它的不同方法,并且其中一个允许对它进行反序列化以获得json。我将重写此方法,以便与其反序列化该类,不直接返回自己的json。这是经过反编译的ServerPing类,其中带有需要覆盖的注释:https://hastebin.com/urarohejak.java

这是我尝试过的:

        Class<?> serverPingClass = Reflection.getClass("{nms}.ServerPing");
        JsonElement exampleResponse = new JsonParser().parse("{\"description\":{\"text\":\"A Minecraft Server\"}," +
                "\"players\":{\"max\":20,\"online\":0},\"version\":{\"name\":\"Paper 1.12.2\",\"protocol\":340}}");
        Class<?> serverPingSerializerClone = new ByteBuddy()
                .subclass(ServerPing.Serializer.class)
                .method(ElementMatchers.named("a")
                        .and(ElementMatchers.returns(JsonElement.class)
                                .and(ElementMatchers.takesArguments(3))))
                .intercept(FixedValue.value(exampleResponse))
                .make()
                .load(Core.class.getClassLoader(), ClassLoadingStrategy.Default.WRAPPER).getLoaded();

但是我想要的是其中包含serverPingSerializerClone而不是默认值的serverPingClone。

0 个答案:

没有答案