2016-03-01 94 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可以更加明確。感謝您的反饋,並保持良好的工作! –

相關問題