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