Skip to content

Instantly share code, notes, and snippets.

@nemasu
Last active December 21, 2016 06:48
Show Gist options
  • Save nemasu/f89d7741b767c5a86494b4a3e9b2dc2a to your computer and use it in GitHub Desktop.
Save nemasu/f89d7741b767c5a86494b4a3e9b2dc2a to your computer and use it in GitHub Desktop.
Turn Java objects into Strings.
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
public class StringifyObject {
private HashSet<Integer> objects = new HashSet<>();
private StringifyObject() {
}
public static String stringify( Object o ) throws IllegalAccessException {
StringifyObject stringifyObject = new StringifyObject();
return stringifyObject.stringifyObject( o );
}
private static List<Field> getAllFields( Class<?> type ) {
return getAllFields( new LinkedList<Field>(), type );
}
private static List<Field> getAllFields( List<Field> fields, Class<?> type ) {
fields.addAll( Arrays.asList( type.getDeclaredFields() ) );
if( type.getSuperclass() != null ) {
fields = getAllFields( fields, type.getSuperclass() );
}
return fields;
}
private String stringifyObject( Object o ) throws IllegalAccessException {
if( o == null ) {
return "null";
}
int objectHash = System.identityHashCode( o );
if( objects.contains( objectHash ) ) {
return "obj@" + String.valueOf( objectHash );
}
objects.add( objectHash );
StringBuilder sb = new StringBuilder();
boolean toStringImplemented = false;
try {
//toString not declared by this class, so it hasn't been implemented
if( o.getClass() == o.getClass().getMethod( "toString" ).getDeclaringClass() ) {
toStringImplemented = true;
}
} catch( NoSuchMethodException e ) {
}
sb.append( "[" );
sb.append( o.getClass().getName().replace( "[", "Array" ) );
sb.append( "@" );
sb.append( System.identityHashCode( o ) );
sb.append( ":{" );
if( toStringImplemented ) {
sb.append( o.toString() );
} else if( o instanceof Enum ) {
sb.append( ( (Enum) o ).name() );
} else if( o instanceof Iterable ) {
for( Object e : (Iterable) o ) {
sb.append( stringifyObject( e ) );
}
} else if( o.getClass().isArray() ) {
switch( o.getClass().getName() ) {
case "[Z":
for( boolean e : (boolean[]) o ) {
sb.append( "[" );
sb.append( e );
sb.append( "]" );
}
break;
case "[B":
for( byte e : (byte[]) o ) {
sb.append( "[" );
sb.append( e );
sb.append( "]" );
}
break;
case "[S":
for( short e : (short[]) o ) {
sb.append( "[" );
sb.append( e );
sb.append( "]" );
}
break;
case "[I":
for( int e : (int[]) o ) {
sb.append( "[" );
sb.append( e );
sb.append( "]" );
}
break;
case "[J":
for( long e : (long[]) o ) {
sb.append( "[" );
sb.append( e );
sb.append( "]" );
}
break;
case "[F":
for( float e : (float[]) o ) {
sb.append( "[" );
sb.append( e );
sb.append( "]" );
}
break;
case "[D":
for( double e : (double[]) o ) {
sb.append( "[" );
sb.append( e );
sb.append( "]" );
}
break;
case "[C":
for( char e : (char[]) o ) {
sb.append( "[" );
sb.append( e );
sb.append( "]" );
}
break;
case "[L":
default:
if( o.getClass().getName().startsWith( "[L" ) ) {
for( Object e : (Object[]) o ) {
sb.append( stringifyObject( e ) );
}
} else {
throw new RuntimeException( o.getClass().getName() + " is unimplemented :(" );
}
}
} else if( o instanceof Map ) {
for( Object e : ( (Map) o ).keySet() ) {
sb.append( "[" );
sb.append( stringifyObject( e ) );
sb.append( "," );
sb.append( stringifyObject( ( (Map) o ).get( e ) ) );
sb.append( "]" );
}
} else {
for( Field f : getAllFields( o.getClass() ) ) {
if( !f.isAccessible() ) {
f.setAccessible( true );
}
sb.append( "[" );
sb.append( f.getName().replace( "[", "Array" ) );
sb.append( ":" );
sb.append( stringifyObject( f.get( o ) ) );
sb.append( "]" );
}
}
sb.append( "}]" );
return sb.toString();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment