我尝试使用 Byte Buddy 拦截对方法的调用和对 Java 8 lambda 表达式的调用,AgentBuilder
如下所示:
static {
final Instrumentation inst = ByteBuddyAgent.install();
new AgentBuilder.Default()
.type(ElementMatchers.nameContainsIgnoreCase("foo"))
.transform((builder, typeDescription) ->
builder.method(ElementMatchers.any())
.intercept(MethodDelegation.to(LogInterceptor.class)))
.installOn(inst);
}
public static class LogInterceptor {
@RuntimeType
public static Object log(@SuperCall Callable<?> superCall) throws Exception {
System.out.println("yeah...");
return superCall.call();
}
}
我正在使用字节好友 v0.7.1。
它可以拦截以下Runnable
(匿名类):
FunnyFramework.callMeLater(new Runnable() {
@Override
public void run() {
System.out.println("Hello from inner class");
}
});
当然还有对定义为普通(非匿名)类的对象的任何调用。但拦截不适用于 lambda 表达式,例如:
FunnyFramework.callMeLater(() -> {
System.out.println("Hello from lambda");
});
我怎样才能拦截 lambda 表达式调用?据我所知,Byte Buddy 中没有LambdaInterceptor这样的东西。