cerco di intercettare le chiamate ai metodi e le chiamate a Java 8 espressioni lambda utilizzando un byte compagno AgentBuilder
come segue:intercettare le chiamate a Java 8 lambda-espressioni utilizzando Byte amici
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();
}
}
sto usando Byte amici v0 .7.1.
Può intercettare il seguente Runnable
(classe anonima):
FunnyFramework.callMeLater(new Runnable() {
@Override
public void run() {
System.out.println("Hello from inner class");
}
});
e naturalmente eventuali chiamate agli oggetti definiti come normali classi (non anonimi). Ma l'intercettazione non funziona per un'espressione lambda:
FunnyFramework.callMeLater(() -> {
System.out.println("Hello from lambda");
});
Come posso intercettare anche le chiamate di espressione lambda? Non esiste una cosa come la LambdaInterceptor in Byte Buddy, per quanto ne so.
La strumentazione delle espressioni lambda è ora possibile a partire da Byte Buddy 1.1.0 –