Это не будет работать. Большинство JVM не позволяют добавлять поле в уже загруженный класс. Таким образом, несмотря на то, что Byte Buddy может корректировать байт-код, это не сработает, даже если все сделано правильно после загрузки класса. Для правильного способа также потребуется агент Java, который можно подключить с помощью проекта Byte Buddy Agent, например:
new ByteBuddy()
.redefine(MyDocument.class)
.defineField("_id", int.class, Visibility.PUBLIC)
.make()
.load(MyDocument.class.getClassLoader(), ClassReloadingStrategy.fromInstalledAgent());
Однако это не сработает из-за ограничений виртуальной машины, вы также можете изменить содержимое метода.
Вы можете присоединить агент Java, чтобы добавить поле до запуска приложения, где класс еще не загружен. Это можно сделать с помощью агента Java, и Byte Buddy может легко реализовать такой агент:
new AgentBuilder.Default()
.type(named("<package>.MyDocument"))
.transform((builder, typeDescription, classLoader, module) -> builder
.defineField("_id", int.class, Visibility.PUBLIC))
.installOn(<instrumentation>);
Таким образом, поле добавляется перед первой загрузкой класса, если вы добавите этот код вpremain
метод вашего агента.
Мне, однако, интересно, если это правильный подход к вашей проблеме. Обычно я предпочел бы использовать слабую карту, чем инструментарий байт-кода.