如何定位:
昨天的案例中使用的是精准定位,即clazz = 类的路径
例:
```
@OnMethod(
clazz="com.rt.BtraceTest", method="add", location=@Location(Kind.RETURN)
)
```
这样子写的话,每个类都要写个脚本,到生产环境上是个大工程啊!
于是就有了plan B,正则表达式定位
正则表达式在两个"/"之间,中间的.用//转译
例:
```
@OnMethod(
clazz="/com\\.rt\\..*/", method="/.*/", location=@Location(Kind.RETURN)
)
```
但是这个方法的会,如果范围太大,就会影响性能,所以正式环境中,范围要尽可能的小一点.
小一点有不够全怎么办呢!
于是plan C正式上场了,按接口或继承类定位
写一个base的接口或者基类,在类的前面加上”+”就可以了
例:
```
@OnMethod(
clazz="+com.rt.BaseBtrace", method="/.*/", location=@Location(Kind.RETURN)
)
```
这样就想要定位谁就自己继承或实现一下,是不是完美
够用了吧,其实还有一个注解定位.
查了很多资料,试了很久都没成功,决定放弃
希望有成功的大佬能指导我一下.
附上几个测试小demo
//最简单的参数输出
```
@OnMethod(
clazz="com.rt.BtraceTest", method="add", location=@Location(Kind.RETURN)
)
public static void func(int a, int b, @Return int result) {
println("trace: =======================");
jstack();
println(strcat("a:", str(a)));
println(strcat("b:", str(b)));
}
```
//调用了几次
```
@Export static AtomicLong counter = new AtomicLong();
@OnMethod(
clazz="com.rt.BtraceTest", method="add", location=@Location(Kind.RETURN)
)
public static void run() {
counter.getAndIncrement();
}
@OnTimer(1000 * 30)
public static void run(){
BtraceUtils.println("count:" + counter.get());
counter.set(0);
}
//调用gc
@OnMethod(clazz = "java.lang.System", method = "gc")
public static void onSystemGC() {
println("entered System.gc()");
jstack();
}
```
网友评论