2016-12-03 6 views
1

私は、実行時にByteBuddyAgentを使ってデフォルトのメソッドに注釈を付そうとしています。既定の実装を維持するために、私はリベース戦略を使用していますが、元のメソッドへの呼び出しで新しいメソッドをインターセプトする方法を理解することはできません。ByteBuddyでインターフェースのデフォルトメソッドをリベースするには?

私はMethodCall.invokeSuper()MethodCall.invokeSelf().onDefault()を使ってみましたが、どちらも私にIllegalStateExceptionを与えました。

new ByteBuddy() 
.subclass(MyInterface.class) 
.method(isDeclaredBy(typeDescription).and(isDefaultMethod())) 
    .intercept(MethodCall.invokeSelf().onDefault()) 
    .annotateMethod(AnnotationDescription.Builder 
     .ofType(MyAnnotation.class).build()) 
.make() 
... 

答えて

1

SuperMethodCall.INSTANCEを使用する必要があります。このようにして、Byte Buddyは実際のスーパーメソッドを見つけることができます。これはリベースされたメソッドです。

あなたの場合、同じメソッドを再帰的に呼び出すだけです。また、onDefault構成では、MyInterfaceによって実装されたインターフェイスでデフォルトのメソッドを呼び出そうとします。

関連する問題