如何使用bytebuddy

时间:2018-02-07 05:16:42

标签: java performance byte-buddy

我有一个这样的课程

public class SampleClass {

    public void startMethod(int no){
    //some works!!
}
public void endMethod(String name){
    //some works!!
}    
}

我正在使用Advice来获取此方法的指标。

public class TimerAdvice {

@Advice.OnMethodEnter
static void enter(@Advice.Origin String method){

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

}

@Advice.OnMethodExit
static void exit(@Advice.Origin String method){
    if (method.equals("endMethod")) {
       //Metrics works
        }
    }
}
}

我想将@Advice.OnMethodEnter的指标计时器(或任何字段)添加到SampleClass,并从@Advice.OnMethodExit获取 这可以吗?我认为我的问题很清楚。

1 个答案:

答案 0 :(得分:0)

您必须使用每个建议方法定义两个类,然后将每个建议应用于要更改的方法。您可以使用Byte Buddy的类型构建器API定义字段:

new ByteBuddy()
  .redefine(SampleClass.class)
  .visit(Advice.to(TimerAdviceStart.class).on(named("startMethod"))
  .visit(Advice.to(TimerAdviceEnd.class).on(named("endMethod"))
  .defineField("foo", long.class, Visibility.PRIVATE)
  .make();

您现在可以使用foo来读取@Advice.Field字段。但是,由于线程问题,您应该小心。

此外,对于重新定义Java代理的类,无法执行此操作,因为JVM禁止向已加载的类添加字段。