如何使用ByteBuddy重新定义接口默认方法?

时间:2016-12-03 22:51:21

标签: java bytecode instrumentation byte-buddy

我尝试使用ByteBuddyAgent在运行时注释默认方法。为了保持默认实现,我使用了一种变基策略,但我无法通过调用原始方法来了解如何拦截新方法。

我尝试使用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 个答案:

答案 0 :(得分:1)

您需要使用SuperMethodCall.INSTANCE。通过这种方式,Byte Buddy有机会找到实际的超级方法,这是一种重新定位的方法。

在您的情况下,您只能递归调用相同的方法。此外,onDefault配置将尝试在MyInterface实现的接口上调用默认方法。