11package stackparam ;
22
33import java .util .Arrays ;
4+ import java .lang .reflect .Method ;
45
56public class StackParamNative {
67
@@ -10,6 +11,15 @@ public class StackParamNative {
1011 */
1112 public static int MAX_PARAM_STR_LEN = 50 ;
1213
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+
1323 /**
1424 * Returns the stack params of the given thread for the given depth. It is
1525 * returned with closest depth first.
@@ -60,14 +70,18 @@ public static String appendParamsToFrameString(String frameString, Object[] para
6070 if (param .length () <= MAX_PARAM_STR_LEN ) ret .append (param );
6171 else ret .append (param , 0 , MAX_PARAM_STR_LEN ).append ("..." );
6272 }
63- return ret .append ("]" ).toString ();
73+ return ret .append ("]" ).toString (). replace ( " \n " , " \\ n" ) ;
6474 } catch (Exception e ) {
6575 return frameString + "[failed getting params: " + e + "]" ;
6676 }
6777 }
6878
6979 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 ()) {
7185 if (paramVal instanceof boolean []) return Arrays .toString ((boolean []) paramVal );
7286 else if (paramVal instanceof byte []) return Arrays .toString ((byte []) paramVal );
7387 else if (paramVal instanceof char []) return Arrays .toString ((char []) paramVal );
@@ -78,6 +92,25 @@ private static String paramValToString(Object paramVal) {
7892 else if (paramVal instanceof double []) return Arrays .toString ((double []) paramVal );
7993 else return Arrays .toString ((Object []) paramVal );
8094 }
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+ }
81114 return String .valueOf (paramVal );
82115 }
83116}
0 commit comments