Я разрабатываю небольшой персональный 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 внутри вместо стандартного.