代码之家  ›  专栏  ›  技术社区  ›  Carlos Melo

如何使用ByteBuddy重新设置接口默认方法的基础?

  •  2
  • Carlos Melo  · 技术社区  · 8 年前

    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 回复  |  直到 8 年前
        1
  •  1
  •   Rafael Winterhalter    8 年前

    你需要使用 SuperMethodCall.INSTANCE 通过这种方式,字节伙伴有机会定位实际的超级方法,即重基方法。

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