我想用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
,以获得更多可用于注入上下文信息的注释。