如何使用带有初始复数值的ByteBuddy定义私有静态最终字段?

问题描述 投票:1回答:1

[阅读文档和few Github issues证明是特别有用的之后,我了解到,在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。这可能吗?

byte-buddy
1个回答
0
投票

默认的初始值设定项需要一个非最终字段,但是您可以自己实现,以通过将setAccessible调用为true来设置最终字段的值。

一种更优雅的解决方案可能是在静态初始化器中设置该字段。这种方法的问题是,除非调用初始化程序时可以从某个地方访问该字段,否则只能设置从编译时常量(基元和字符串)汇编的值。例如:

builder = builder.invokeable(isTypeInitializer()).intercept(MethodCall.invoke(...).setsField(...))

您需要创建一个FieldDescription.Latent来引用您创建的字段。

© www.soinside.com 2019 - 2024. All rights reserved.