我想用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))


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

10-01 01:48