После прочтения документации и нескольких проблем Github , которые оказались особенно полезными, я пришел к выводу, что в терминологии ByteBuddy поле static
должно быть установлено в его начальное значение с помощью LoadedTypeInitializer
некоторого вида.
Я не знал, что делать с LoadedTypeInitializer.ForStaticField
, как только я его создал. Затем, к счастью, я просто наткнулся на initializer()
метод DynamicType.Builder
. Вот мой рецепт (который не работает):
builder = builder
.initializer(new LoadedTypeInitializer.ForStaticField("$frob", this.frob))
.defineField("$frob",
Frob.class,
Ownership.STATIC,
SyntheticState.SYNTHETIC,
Visibility.PRIVATE,
FieldManifestation.FINAL);
Если я проверю значение этого поля с помощью отражения после загрузки типа, поле будет там, но оно установлено на null
.
Если я удаляю FieldManifestation.FINAL
из этого рецепта, он работает. Но в идеале я хотел бы, чтобы мое поле было final
. Это возможно?