переопределить метод статического класса внутри другого класса во время выполнения, используя bytebuddy - PullRequest
0 голосов
/ 24 июня 2019

Я разрабатываю небольшой персональный API, чтобы иметь возможность настраивать пинг списка серверов Minecraft через spigot (модифицированный сервер для создания плагинов).https://wiki.vg/Server_List_Ping

Проблема в том, что каждая версия spigot пакета меняет имя, и я должен избегать создания дюжины различных классов, которые делают одно и то же.Для достижения моих целей я должен создать объект PacketStatusOutServerInfo, который инициализируется с объектом ServerPing.Этот частично запутанный объект 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();

Но то, что я хотел бы, - это serverPingClone с этимserverPingSerializerClone внутри вместо стандартного.

...