使用Btrace時我希望監控到傳遞的list參數值,這時調用println(str(list1));這樣的語句就可以打印list中的所有值,代碼如下:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/**
* TODO Comment of TestList
*/
public class TestList {
public static List<String> mergeList(List<String> list1, List<String> list2) {
List<String> list = new ArrayList<String>();
if (list1 != null && list1.size() > 0) {
for (String str : list1) {
list.add(str);
}
}
if (list2 != null && list2.size() > 0) {
for (String str : list2) {
list.add(str);
}
}
return list;
}
public static void main(String[] args) {
int i = 0;
while (i < 2000000) {
System.out.println(i);
i++;
}
List<String> list1 = Arrays.asList("a,b,c,d,e,f,g".split(","));
List<String> list2 = Arrays.asList("h,i,j,k,l,m,n".split(","));
mergeList(list1, list2);
}
}
import com.sun.btrace.annotations.BTrace;
import com.sun.btrace.annotations.Kind;
import com.sun.btrace.annotations.Location;
import com.sun.btrace.annotations.OnMethod;
import com.sun.btrace.annotations.Return;
import static com.sun.btrace.BTraceUtils.*;
@BTrace
public class PrintArgArray {
@OnMethod(clazz = "TestList", method = "mergeList", location = @Location(Kind.RETURN))
public static void testList(java.util.List<String> list1, java.util.List<String> list2,
@Return java.util.List<String> list) {
println(str(list1));
println("----------------------------------");
println(str(list2));
println("----------------------------------");
println(str(list));
}
}
首先啓動TestList類,然後運行btrace pid PrintArgArray.java,可以看到打印的結果。
上面時打印普通的String list,而對於List中是其它對象的呢?代碼如下:
import java.io.Serializable;
public class User implements Serializable {
/**
*
*/
private static final long serialVersionUID = -7020619477594468968L;
private long id;
private String userName;
private String gender;
public User(long id, String userName, String gender) {
this.id = id;
this.userName = userName;
this.gender = gender;
}
/**
* @return the id
*/
public long getId() {
return id;
}
/**
* @param id the id to set
*/
public void setId(long id) {
this.id = id;
}
/**
* @return the userName
*/
public String getUserName() {
return userName;
}
/**
* @param userName the userName to set
*/
public void setUserName(String userName) {
this.userName = userName;
}
/**
* @return the gender
*/
public String getGender() {
return gender;
}
/**
* @param gender the gender to set
*/
public void setGender(String gender) {
this.gender = gender;
}
@Override
public String toString() {
return "User = [ userName = " + userName + " gender = " + gender + "]";
}
}
import java.util.ArrayList;
import java.util.List;
public class TestList2 {
public static void main(String[] args) {
int i = 0;
while (i < 2000000) {
System.out.println(i);
i++;
}
User user = null;
List<User> list1 = new ArrayList<User>();
for (int j = 0; j < 10; j++) {
user = new User(j, "userName1" + j, "gender1" + j);
list1.add(user);
}
List<User> list2 = new ArrayList<User>();
for (int j = 0; j < 10; j++) {
user = new User(j, "userName2" + j, "gender2" + j);
list2.add(user);
}
mergeUserList(list1, list2);
}
public static List<User> mergeUserList(List<User> list1, List<User> list2) {
List<User> list = new ArrayList<User>();
list.addAll(list1);
list.addAll(list2);
return list;
}
}
import static com.sun.btrace.BTraceUtils.println;
import static com.sun.btrace.BTraceUtils.str;
import com.sun.btrace.annotations.BTrace;
import com.sun.btrace.annotations.Kind;
import com.sun.btrace.annotations.Location;
import com.sun.btrace.annotations.OnMethod;
import com.sun.btrace.annotations.Return;
@BTrace
public class PrintArgArray2 {
@OnMethod(clazz = "TestList2", method = "mergeUserList", location = @Location(Kind.RETURN))
public static void testUserList(java.util.List<User> list1, java.util.List<User> list2,
@Return java.util.List<User> list) {
println(str(list1));
println("----------------------------------");
println(str(list2));
println("----------------------------------");
println(str(list));
}
}
合併兩個list,list中存放的爲user對象,最後用btrace打印兩個參數list和結果list中的user值,結果如下
[User = [ userName = userName10 gender = gender10], User = [ userName = userName11 gender = gender11], User = [ userName = userName12 gender = gender12], User = [ userName = userName13 gender = gender13], User = [ userName = userName14 gender = gender14], User = [ userName = userName15 gender = gender15], User = [ userName = userName16 gender = gender16], User = [ userName = userName17 gender = gender17], User = [ userName = userName18 gender = gender18], User = [ userName = userName19 gender = gender19]]
----------------------------------
[User = [ userName = userName20 gender = gender20], User = [ userName = userName21 gender = gender21], User = [ userName = userName22 gender = gender22], User = [ userName = userName23 gender = gender23], User = [ userName = userName24 gender = gender24], User = [ userName = userName25 gender = gender25], User = [ userName = userName26 gender = gender26], User = [ userName = userName27 gender = gender27], User = [ userName = userName28 gender = gender28], User = [ userName = userName29 gender = gender29]]
----------------------------------
[User = [ userName = userName10 gender = gender10], User = [ userName = userName11 gender = gender11], User = [ userName = userName12 gender = gender12], User = [ userName = userName13 gender = gender13], User = [ userName = userName14 gender = gender14], User = [ userName = userName15 gender = gender15], User = [ userName = userName16 gender = gender16], User = [ userName = userName17 gender = gender17], User = [ userName = userName18 gender = gender18], User = [ userName = userName19 gender = gender19], User = [ userName = userName20 gender = gender20], User = [ userName = userName21 gender = gender21], User = [ userName = userName22 gender = gender22], User = [ userName = userName23 gender = gender23], User = [ userName = userName24 gender = gender24], User = [ userName = userName25 gender = gender25], User = [ userName = userName26 gender = gender26], User = [ userName = userName27 gender = gender27], User = [ userName = userName28 gender = gender28], User = [ userName = userName29 gender = gender29]]
注意運行第二個實例前要把user這個類要實現toString方法,這樣纔會打印出每個字段的值。
其次先編譯User這個類,我是在當前目錄下運行的,或者也可以制定classpath。否則會報BTrace compilation failed錯誤