Ich versuche Anrufe Methoden abfangen und ruft Java 8 Lambda-Ausdrücke mit einem Byte Buddy AgentBuilder
wie folgt:Intercepting Anrufe auf Java 8 Lambda-Ausdrücke Byte Buddy
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();
}
}
Ich verwende Byte Buddy v0 .7.1.
Es kann die folgenden Runnable
(anonyme Klasse) abfangen:
FunnyFramework.callMeLater(new Runnable() {
@Override
public void run() {
System.out.println("Hello from inner class");
}
});
und natürlich alle Anrufe auf Objekte definiert als normalen (nicht anonym) Klassen. Aber das Abhören funktioniert nicht für die Lambda-Ausdruck ist wie:
FunnyFramework.callMeLater(() -> {
System.out.println("Hello from lambda");
});
Wie kann ich Expression Anrufe auch die Lambda abfangen? Es gibt kein LambdaInterceptor in Byte Buddy, soweit ich weiß.
Das Instrumentieren von Lambda-Ausdrücken ist jetzt ab Byte Buddy 1.1.0 möglich –