如何使用bytebuddy获取方法的参数

时间:2018-02-01 07:07:27

标签: java performance byte-buddy

我正在尝试使用Java应用程序的指标来查找性能。我使用java代理与bytebuddy获取metrics。在我的测试程序中,我要检查的方法运行了几次。只有当我传递参数包含名称'connector'时我需要获取指标。所以我想用bytebuddy来解决这个问题,我使用了@AllArguments Object[] args。但我尝试使用这个我的TimerAdvice类没有运行。 这是我的代码

class Agent {

public static void premain(String arguments, Instrumentation instrumentation) {
    System.out.println("Premain");
    new AgentBuilder.Default()
            .with(new AgentBuilder.InitializationStrategy.SelfInjection.Eager())
            .type((ElementMatchers.nameContains("ConnectorCallback")))
            .transform(
                    new AgentBuilder.Transformer.ForAdvice()
                            .include(MethodListner.class.getClassLoader())
                            .advice(ElementMatchers.any(), MethodListner.class.getName())
            ).installOn(instrumentation);}}

这是我的TimerAdvice类

public class TimerAdvice {


@Advice.OnMethodEnter
static void enter(@Advice.Origin String method , @AllArguments Object[] args)throws Exception  {

    if (changeMethodName(method).equals("BalConnectorCallback")) {
        //Metrics works
    }

}

@Advice.OnMethodExit
static void exit(@Advice.Origin String method, @AllArguments Object[] args) throws Exception {

    if (changeMethodName(method).equals("done")) {
       //Metrics works
        }
    }

 public static String changeMethodName(String method) {
    String newMethod = method.substring(0, method.lastIndexOf('('));
    newMethod = newMethod.substring(newMethod.lastIndexOf('.') + 1);
    //newMethod = newMethod.replace(".", " ");
    return newMethod;

}}

当我使用@AllArguments Object[] args这个时,只有TimerAdvice在没有它的情况下无法正常工作。我的代码中存在这个问题吗? 任何帮助..

1 个答案:

答案 0 :(得分:1)

您可能正在导入错误的注释。您正在寻找的注释是@Advice.AllArguments

这种命名结合是不幸的,但改变它已经太晚了。所有建议可兼容的注释都是前缀。 Tge其他用于方法委派。