2016-12-03 68 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實現的接口上的默認方法。