如何使用 ByteBuddy 拦截方法,就像在 CGLIB 中一样,使用 MethodInterceptor 调用 MethodProxy.invokeSuper(...)

How to intercept method with ByteBuddy as in CGLIB with MethodInterceptor for calling MethodProxy.invokeSuper(...)

我想用ByteBuddy拦截一些方法。 当我使用 InvocationHandlerAdapter.of(invocationHandler) 时,我无法调用超级方法。持有对象实例不适合我的情况。我想要像下面这样的 CGLIB。

(MethodInterceptor)(obj, method, args, proxy)->{
   // to do some work
   Object o = proxy.invokeSuper(obj,args);
   // to do some work
   return o;
}

如何在ByteBuddy中实现这样的拦截方法?

我尝试了 MethodCall 类型的 Implemetation 但它没有解决我的问题。因为在这种情况下我无法管理MethodCall.invokeSuper()

.intercept(MethodCall
                        .run(() -> System.out.println("Before"))
                        .andThen(MethodCall.invokeSuper())
                        .andThen(MethodCall
                                .run((() -> System.out.println("After")))))

看看MethodDelegation,例如:

public class MyDelegation {
  @RuntimeType
  public static Object intercept(@SuperCall Callable<?> superCall) throws Exception {
    // to do some work
    Object o = superCall.call();
    // to do some work
    return o;
  }
}

然后使用:

.intercept(MethodDelegation.to(MyDelegation.class))

您可以查看 MethodDelegation 的 javadoc 以获得更多可用于注入上下文信息的注释。