如何为新定义的字段分配默认值?
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
注释结合使用。该文档显示了如何完成此操作的示例。
这是我第一次使用 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
注释结合使用。该文档显示了如何完成此操作的示例。