4

这是我第一次使用 ByteBuddy,我想动态创建一个java.lang.Object只有一个名为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

4

1 回答 1

3

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

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

于 2016-03-02T08:56:47.280 回答