如何为新定义的字段分配默认值?

How to assign a default value to a newly defined field?

这是我第一次使用 ByteBuddy,我想动态创建一个 java.lang.Object 的子类,其中只有一个 public 字段名为 myValue 类型java.lang.String 和默认值 "Hello World !"。 不幸的是,在调用 myClass.newInstance() 之后,该字段的值为 null(在 Eclipse 调试器中)。

final Class<?> myClass = new ByteBuddy().subclass(Object.class).name("test.MyClass")
    .defineField("myValue", String.class, Visibility.PUBLIC)
    .value("Hello World !")
    .make()
    .load(getClass().getClassLoader(), ClassLoadingStrategy.Default.INJECTION).getLoaded();
Object myObject = myClass.newInstance();

我是不是遗漏了什么?

我正在使用 Eclipse Mars.2、Oracle JDK 1.7.0_75 和 ByteBuddy-1.2.3

value 方法正在为一个字段写入一个 常量池默认值,这仅在 Java 中对 static 字段才有可能。 Byte Buddy 应该在这种情况下抛出异常,而不是默默地抑制错误。我将在下一个版本中更改此行为并更新 javadoc 以更清楚地了解 value 方法的作用。

如果要设置字段值,需要拦截任何构造函数来设置字段值。您可以通过不同的方式执行此操作,例如将 MethodDelegation@FieldProxy 注释结合使用。该文档显示了如何完成此操作的示例。