byte-buddy
byte-buddy copied to clipboard
Java agent Advice Demo using problem
I wrote a demo for java agent
public class AgentStarter {
public static void agentmain(String agentArgs, Instrumentation inst) {
System.out.println("agent main");
}
public static void premain(String agentArgs, Instrumentation inst) {
System.out.println("premain");
ByteBuddyInstaller.install(inst);
}
}
public class ByteBuddyInstaller {
public static void install(Instrumentation inst) {
new AgentBuilder.Default()
.type(ElementMatchers.named("org.example.AgentTest"))
.transform((builder, type, classLoader, module, pd)
-> builder.visit(Advice.to(ByteBuddyInstaller.TimeAdvice.class).on(ElementMatchers.named("test"))))
.installOn(inst);
}
public static class TimeAdvice {
@Advice.OnMethodEnter(suppress = Throwable.class)
public static void enter() {
System.out.println("enter");
long startTime = System.currentTimeMillis();
}
@Advice.OnMethodExit(onThrowable = Throwable.class)
public static void exit(@Advice.Enter long startTime) {
long endTime = System.currentTimeMillis();
long executionTime = endTime - startTime;
System.out.println("Execution Time: " + executionTime + " ms");
}
}
}
if i use the jar to start it will report exception:
Caused by: java.lang.ClassNotFoundException: net.bytebuddy.matcher.ElementMatcher
at java.net.URLClassLoader.findClass(URLClassLoader.java:387)
at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
... 7 more
If i use the ide to start, it will not report exception but it will only output "premain" and no other logs.
Did you include Byte Buddy in your jar? The agent needs to pack all of its dependencies.
I solved it by using "inst.appendToBootstrapClassLoaderSearch", maybe it's caused by classloader?