new AgentBuilder.Default().type(ElementMatchers.any())
.transform(new AgentBuilder.Transformer() {
@Override
public Builder<?> transform(Builder<?> builder,
TypeDescription arg1, ClassLoader arg2) {
return builder
.method(ElementMatchers.any())
.intercept(MethodDelegation.to(MethodProfiler.class));
}
}).installOn(ByteBuddyAgent.install());public static void intercept(@Origin Method m, @SuperCall Callable<?> zuper) throws Exception {
System.out.println("before " + m.getName());
zuper.call();
System.out.println("after " + m.getName());
}new AgentBuilder.Default().type(ElementMatchers.any())
.transform(new AgentBuilder.Transformer() {
@Override
public Builder<?> transform(Builder<?> builder,
TypeDescription arg1, ClassLoader arg2) {
return builder
.method(ElementMatchers.any())
.intercept(MethodDelegation.to(MethodProfiler.class)
.filter(ElementMatchers.named("before"))
.andThen(SuperMethodCall.INSTANCE
.andThen(MethodDelegation.to(MethodProfiler.class)
.filter(ElementMatchers.named("after"))
)));
}
installOn(ByteBuddyAgent.install());public static void before(@Origin Method method) {
System.out.println("intercepted before " + method.getName());
}
public static void after(@Origin Method method) {
System.out.println("intercepted after " + method.getName());
}
[Byte Buddy] TRANSFORM Calculator
[Byte Buddy] COMPLETE Calculator
[Byte Buddy] IGNORE Calculator$auxiliary$iomGvCCq
[Byte Buddy] COMPLETE Calculator$auxiliary$iomGvCCq
[Byte Buddy] IGNORE Calculator$auxiliary$dlCUpsmI
[Byte Buddy] COMPLETE Calculator$auxiliary$dlCUpsmI
[Byte Buddy] IGNORE Calculator$auxiliary$nuZtDMa1
[Byte Buddy] COMPLETE Calculator$auxiliary$nuZtDMa1
[Byte Buddy] IGNORE Calculator$auxiliary$mwTSS44U
[Byte Buddy] COMPLETE Calculator$auxiliary$mwTSS44U
[Byte Buddy] IGNORE Calculator$auxiliary$v46iNdxd
[Byte Buddy] COMPLETE Calculator$auxiliary$v46iNdxd
before sum
this is Sum
after sum
sum is: 9
[Byte Buddy] ERROR java.lang.Shutdown
java.lang.IllegalStateException: Injecting classes into the bootstrap class loader was not enabled
at net.bytebuddy.agent.builder.AgentBuilder$Default$BootstrapInjectionStrategy$Disabled.make(AgentBuilder.java:3790)
at net.bytebuddy.agent.builder.AgentBuilder$Default$Transformation$Simple$Resolution$BootstrapClassLoaderCapableInjectorFactory.resolve(AgentBuilder.java:4324)
at net.bytebuddy.agent.builder.AgentBuilder$InitializationStrategy$SelfInjection$Dispatcher$Split.register(AgentBuilder.java:1100)
at net.bytebuddy.agent.builder.AgentBuilder$Default$Transformation$Simple$Resolution.apply(AgentBuilder.java:4240)
at net.bytebuddy.agent.builder.AgentBuilder$Default$ExecutingTransformer.transform(AgentBuilder.java:4536)
at sun.instrument.TransformerManager.transform(TransformerManager.java:188)
at sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:424)
[Byte Buddy] COMPLETE java.lang.Shutdown
[Byte Buddy] ERROR java.lang.Shutdown$Lock
java.lang.IllegalStateException: Injecting classes into the bootstrap class loader was not enabled
at net.bytebuddy.agent.builder.AgentBuilder$Default$BootstrapInjectionStrategy$Disabled.make(AgentBuilder.java:3790)
at net.bytebuddy.agent.builder.AgentBuilder$Default$Transformation$Simple$Resolution$BootstrapClassLoaderCapableInjectorFactory.resolve(AgentBuilder.java:4324)
at net.bytebuddy.agent.builder.AgentBuilder$InitializationStrategy$SelfInjection$Dispatcher$Split.register(AgentBuilder.java:1100)
at net.bytebuddy.agent.builder.AgentBuilder$Default$Transformation$Simple$Resolution.apply(AgentBuilder.java:4240)
at net.bytebuddy.agent.builder.AgentBuilder$Default$ExecutingTransformer.transform(AgentBuilder.java:4536)
at sun.instrument.TransformerManager.transform(TransformerManager.java:188)
at sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:424)
at java.lang.Shutdown.<clinit>(Shutdown.java:61)
[Byte Buddy] COMPLETE java.lang.Shutdown$LockCan you tell me a little about whether it's possible to perform method interception in a zero-garbage manner?
I assume the Callable<?> passed to the interceptor is created for each invocation?
Also, if my intercepted method returns a primitive type, will the return value be boxed/unboxed during the interception?
Thanks
Mark