我的应用程序的目的是捕获加载的类、方法及其参数。下面声明的是 premain 和类 Interceptor 中的实现。类应该打印方法名、类名等,但是,类 Interceptor 不会被调用/执行。请协助理解这里的问题。
public static void premain(String agentArgs, Instrumentation instrumentation) {
new AgentBuilder.Default()
.with(AgentBuilder.Listener.StreamWriting.toSystemOut())
.type(ElementMatchers.any())
.transform((builder, typeDescription, classLoader, module) -> builder
.visit(Advice.to(Interceptor.class).on(ElementMatchers.any()))
)
.installOn(instrumentation);
// Register a ClassFileTransformer to handle retransformations (if supported)
ClassFileTransformer classFileTransformer = new ClassFileTransformer() {
@Override
public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined,
ProtectionDomain protectionDomain, byte[] classfileBuffer) {
// Perform additional transformations for specific classes here
return classfileBuffer;
}
};
// Check if retransformations are supported before adding the transformer
if (instrumentation.isRetransformClassesSupported()) {
instrumentation.addTransformer(classFileTransformer, true);
}
}
public static class Interceptor {
@Advice.OnMethodEnter
public static void onMethodEnter(@Advice.Origin String origin,
@Advice.AllArguments Object[] args,
@Advice.Origin("#t") String className,
@Advice.Origin("#m") String methodName
) {
System.out.println("Origin:"+origin+" args:"+args);
if(args != null) {
for(int i =0 ; i < args.length ; i++){
System.out.println("Argument: " + i + " is " + args[i]);
}
}
System.out.println("Origin :" + origin);
System.out.println("ClassName :" + className);
System.out.println("MethodName :"+methodName);
}
}
编译了 premain 并构建了 jar 文件。然后将 jarfile 作为 javaagent 附加到在 K8s 上运行的应用程序。期望 Interceptor 类打印类名、方法名等,但徒劳无功。
您可以注册
AgentBuilder.Listener
查看是否有异常情况发生。另外,您应该注册一个AgentBuilder.RetransformationStrategy
以进行重新转换。