次のように、Byte Buddy を使用して、メソッドの呼び出しと Java 8 ラムダ式の呼び出しをインターセプトしようとし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();
}
}
Byte Buddy v0.7.1 を使用しています。
以下をインターセプトできますRunnable(匿名クラス)。
FunnyFramework.callMeLater(new Runnable() {
@Override
public void run() {
System.out.println("Hello from inner class");
}
});
もちろん、通常の(非匿名) クラスとして定義されたオブジェクトへの呼び出しも含まれます。ただし、インターセプトは、次のようなラムダ式では機能しません。
FunnyFramework.callMeLater(() -> {
System.out.println("Hello from lambda");
});
ラムダ式の呼び出しも傍受するにはどうすればよいですか? 私の知る限り、Byte Buddy にはLambdaInterceptorのようなものはありません。