byte-buddy:在 builder.visit 中声明的类(未调用 Advice.to

问题描述 投票:0回答:1

我的应用程序的目的是捕获加载的类、方法及其参数。下面声明的是 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 类打印类名、方法名等,但徒劳无功。

instrumentation byte-buddy
1个回答
0
投票

您可以注册

AgentBuilder.Listener
查看是否有异常情况发生。另外,您应该注册一个
AgentBuilder.RetransformationStrategy
以进行重新转换。

© www.soinside.com 2019 - 2024. All rights reserved.