拦截方法
普通方法@OnMethod(clazz=””,method=””)
构造函数@OnMethod(clazz=””,method=”<init>”)
拦截同名函数,用参数区分
拦截构造函数
执行程序
public class User {
private int id;
private String name;
public User(int id, String name) {
super();
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String toString(){
return "id="+id+",name="+name;
}
}
public class constructor {
public static void main(String[] args) throws InterruptedException {
while(true){
read(new User(1,"meimei"));
Thread.sleep(10000);
}
}
public static User read(User user){
System.out.println(user);
return user;
}
}
Btrace脚本
import com.sun.btrace.AnyType;
import com.sun.btrace.BTraceUtils;
import com.sun.btrace.annotations.BTrace;
import com.sun.btrace.annotations.OnMethod;
import com.sun.btrace.annotations.ProbeClassName;
import com.sun.btrace.annotations.ProbeMethodName;
@BTrace
public class PrintConstructor {
@OnMethod(
clazz="com.imooc.monitor_tuning.chapter2.User",
method="<init>"
)
public static void anyRead(@ProbeClassName String pcn, @ProbeMethodName String pmn, AnyType[] args) {
BTraceUtils.println(pcn+","+pmn);
BTraceUtils.printArray(args);
BTraceUtils.println();
}
}
运行效果
C:\Users\Administrator>cd /d e:\
e:\>java -jar constructor.jar
id=1,name=meimei
id=1,name=meimei
##
C:\Users\Administrator>cd /d C:\Program Files\Java\jdk1.8.0_74\bin
C:\Program Files\Java\jdk1.8.0_74\bin>jps
1836 jar
C:\Program Files\Java\jdk1.8.0_74\bin>cd /d e:\
e:\>btrace 1836 E:\PrintConstructor.java
com.imooc.monitor_tuning.chapter2.User,<init>
[1, meimei, ]
com.imooc.monitor_tuning.chapter2.User,<init>
[1, meimei, ]
拦截同名函数
执行程序
public class constructorsame {
public static void main(String[] args) throws InterruptedException {
while(true){
same("meimei",521);
Thread.sleep(10000);
}
}
public static String same( String name) {
return "hello,"+name;
}
public static String same( String name,int id) {
System.out.println("hello,"+name+","+id);
return "hello,"+name+","+id;
}
}
Btrace脚本
import com.sun.btrace.BTraceUtils;
import com.sun.btrace.annotations.BTrace;
import com.sun.btrace.annotations.OnMethod;
import com.sun.btrace.annotations.ProbeClassName;
import com.sun.btrace.annotations.ProbeMethodName;
@BTrace
public class PrintSame {
@OnMethod(
clazz="com.pcitc.constructorsame",
method="same"
)
public static void anyRead(@ProbeClassName String pcn, @ProbeMethodName String pmn, String name, int id) {
BTraceUtils.println(pcn+","+pmn +","+name + "," + id);
BTraceUtils.println();
}
}
因为@ProbeMethodName String pmn, String name, int id是两个参数,所以匹配String same( String name,int id) ,pmn是方法名,所以当执行same( String name,int id)可以被拦截
运行效果
C:\Users\Administrator>cd /d e:\
e:\>java -jar constructor.jar
id=1,name=meimei
id=1,name=meimei
##
C:\Program Files\Java\jdk1.8.0_74\bin>jps
8816 constructorsame.jar
e:\>btrace 8816 E:\PrintSame.java
com.pcitc.constructorsame,same,meimei,521
com.pcitc.constructorsame,same,meimei,521