我有一个这样的课程
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
获取
这可以吗?我认为我的问题很清楚。
答案 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禁止向已加载的类添加字段。