Interceptando llamadas a Java 8 expresiones lambda usando Byte Buddy
Intento interceptar llamadas a métodos y llamadas a expresiones lambda de Java 8 usando un Byte BuddyAgentBuilder
como sigue:
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();
}
}
Estoy usando Byte Buddy v0.7.1.
Puede interceptar lo siguienteRunnable
(clase anónima):
FunnyFramework.callMeLater(new Runnable() {
@Override
public void run() {
System.out.println("Hello from inner class");
}
});
y, por supuesto, cualquier llamada a objetos definidos comonormal (no anónimas) clases. Pero la intercepción no funciona para expresiones lambda como:
FunnyFramework.callMeLater(() -> {
System.out.println("Hello from lambda");
});
¿Cómo puedo interceptar también las llamadas de expresión lambda? No hay tal cosa como unLambdaInterceptor en Byte Buddy, que yo sepa.