1
1
package stackparam ;
2
2
3
3
import java .util .Arrays ;
4
+ import java .lang .reflect .Method ;
4
5
5
6
public class StackParamNative {
6
7
@@ -10,6 +11,15 @@ public class StackParamNative {
10
11
*/
11
12
public static int MAX_PARAM_STR_LEN = 50 ;
12
13
14
+ public static Method DEFAULT_TO_STRING ;
15
+ static {
16
+ try {
17
+ DEFAULT_TO_STRING = Object .class .getMethod ("toString" );
18
+ } catch (Exception e ) {
19
+ //can't happen
20
+ }
21
+ }
22
+
13
23
/**
14
24
* Returns the stack params of the given thread for the given depth. It is
15
25
* returned with closest depth first.
@@ -60,14 +70,18 @@ public static String appendParamsToFrameString(String frameString, Object[] para
60
70
if (param .length () <= MAX_PARAM_STR_LEN ) ret .append (param );
61
71
else ret .append (param , 0 , MAX_PARAM_STR_LEN ).append ("..." );
62
72
}
63
- return ret .append ("]" ).toString ();
73
+ return ret .append ("]" ).toString (). replace ( " \n " , " \\ n" ) ;
64
74
} catch (Exception e ) {
65
75
return frameString + "[failed getting params: " + e + "]" ;
66
76
}
67
77
}
68
78
69
79
private static String paramValToString (Object paramVal ) {
70
- if (paramVal != null && paramVal .getClass ().isArray ()) {
80
+ if (paramVal == null ) {
81
+ return "null" ;
82
+ }
83
+
84
+ if (paramVal .getClass ().isArray ()) {
71
85
if (paramVal instanceof boolean []) return Arrays .toString ((boolean []) paramVal );
72
86
else if (paramVal instanceof byte []) return Arrays .toString ((byte []) paramVal );
73
87
else if (paramVal instanceof char []) return Arrays .toString ((char []) paramVal );
@@ -78,6 +92,25 @@ private static String paramValToString(Object paramVal) {
78
92
else if (paramVal instanceof double []) return Arrays .toString ((double []) paramVal );
79
93
else return Arrays .toString ((Object []) paramVal );
80
94
}
95
+
96
+ // Collapse package names to first letters when using default toString for objects
97
+ try {
98
+ Method toStringMethod = paramVal .getClass ().getMethod ("toString" );
99
+ if (DEFAULT_TO_STRING .equals (toStringMethod )) {
100
+ String tmp = paramVal .toString ();
101
+ String [] split = tmp .split ("\\ ." );
102
+ StringBuilder out = new StringBuilder ();
103
+ for (int i =0 ; i <split .length - 1 ; i ++) {
104
+ String s = split [i ];
105
+ out .append (s .charAt (0 )).append ("." );
106
+ }
107
+ out .append (split [split .length -1 ]);
108
+ return out .toString ();
109
+ }
110
+ } catch (Exception e ) {
111
+ //all objects have toString methods, so can't happen
112
+ throw new RuntimeException ("Can't happen" , e );
113
+ }
81
114
return String .valueOf (paramVal );
82
115
}
83
116
}
0 commit comments