如何使用 ByteBuddy 对接口默认方法进行变基?
How to rebase an interface default method with ByteBuddy?
我正在尝试使用 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()
...
您需要使用 SuperMethodCall.INSTANCE
。这样,Byte Buddy 就有机会找到实际的超级方法,即 rebased 方法。
在你的例子中,你只会递归地调用相同的方法。此外,onDefault
配置将尝试在由 MyInterface
实现的接口上调用默认方法。
我正在尝试使用 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()
...
您需要使用 SuperMethodCall.INSTANCE
。这样,Byte Buddy 就有机会找到实际的超级方法,即 rebased 方法。
在你的例子中,你只会递归地调用相同的方法。此外,onDefault
配置将尝试在由 MyInterface
实现的接口上调用默认方法。