2016-07-01 5 views
1

Byte Buddyを使用してインスタンスフィールドの値を設定する方法を理解しようとしています。ドキュメントには、Byte BuddyでinstanceFieldを設定する

という値が割り当てられています。このような動的クラスのインスタンスでメソッドを呼び出す前に、必ずこのフィールドに値を割り当ててください。それ以外の場合、メソッドの委譲によってNullPointerExceptionが発生します。

しかし、ドキュメントやユニットテストでは、これを行う方法はわかりません。

私の動的なクラスがある:

new ByteBuddy().subclass(AbstractService.class) 
     .name(serviceName) 
     .method(ElementMatchers.named("start").and(
       ElementMatchers.takesArguments(0))) 
     .intercept(
       MethodDelegation.toInstanceField(service, "consumer") 
        .filter(ElementMatchers.isAnnotatedWith(Start.class))) 
     .method(ElementMatchers.named("stop").and(
       ElementMatchers.takesArguments(0))) 
     .intercept(
       MethodDelegation.to(instance).filter(
         ElementMatchers.isAnnotatedWith(Stop.class))) 
     .make(); 

私は、任意のコンストラクタを傍受し、MethodDelegation@FieldProxyを使用するために答えを別のポストを参照してくださいが、私はそれを行う方法が表示されません。

java.lang.IllegalArgumentExceptionが:ときに[]のいずれも、基本的に

答えて

0

...から委任を可能にしていない私は.constructor(ElementMatchers.any()).intercept(...)結果のいくつかのバリエーションで、結果の面で試みたすべてのものMethodDelegation.toInstanceFieldを使用している場合、Byte Buddyは生成されたクラスに指定された名前のフィールドを追加します。あなたの場合、Byte Buddyはserviceフィールドに"consumer"という名前のフィールドを追加しました。

フィールドが値を持たないので、割り当て前にnullであるため、このフィールドにどのように値を割り当てるかを決定する必要があります。これを行う前に@Startという注釈が付けられたメソッドを呼び出した場合、NullPointerExceptionが発生します。

フィールドを割り当てる最も簡単な方法は、リフレクションです。タイプセーフな代替は、あなたのserviceタイプがClass<MyType>であることを考えると、いくつかのインタフェース

interface SetterIFace { 
    void setConsumer(MyType myType); 
} 

を実装することであろう。その後、追加することができます:あなたはMethodDelegationでそれを定義した後

.implement(SetterIFace.class).intercept(FieldAccessor.ofBeanProperty()) 

が問題のフィールドのセッターとしてSetterIFaceを実装します。

関連する問題