2016-03-01 73 views
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

+0

我很困惑,为什么你想这样做? –

+0

原因并非真正相关,因为我只是在探索图书馆(正如“Hello World!”值所示)。我想仿效的课程如下所示: 'package test; public class MyClass {0} {0} {0} public int myValue =“Hello World!”; }' –

回答

3

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

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

+0

我怀疑'value'方法的目的不是设置相应字段的值。我同意javadoc可以更加明确。感谢您的反馈,并保持良好的工作! –

相关问题