4

ByteBuddy を使用するのは初めてで、型のmyValuejava.lang.Objectという名前のパブリック フィールドが 1 つだけで、デフォルト値が "Hello World !"のサブクラスを動的に作成したいと考えています。残念ながら、 myClass.newInstance() を呼び出した後、フィールドの値は(Eclipse デバッガー内で) になります。java.lang.Stringnull

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

このメソッドは、フィールドの Java でのみ可能な、フィールドの定数プールのデフォルト値valueを書き込んでいます。このシナリオでは、Byte Buddy は例外をスローし、エラーを黙って抑制しないようにする必要があります。次のバージョンではこの動作を変更し、javadocを更新してメソッドの動作をより明確にする予定です。staticvalue

フィールド値を設定する場合は、コンストラクターをインターセプトしてフィールド値を設定する必要があります。をアノテーションMethodDelegationと組み合わせて使用​​するなど、さまざまな方法でこれを行うことができます。@FieldProxyドキュメントには、これを行う方法の例が示されています。

于 2016-03-02T08:56:47.280 に答える