Is there an equivalent module in java?
Partially, there is no need for :
ata:
umper:
umper, because
Java already has the, er, message »toString()« for this purpose.
But, »toString()« has difficulties. To get a meaningful dump,
one does not use »array.toString()«, but
»java.util.Arrays.toString( a )«.
»toString()« also might not always dump all details.
Objects can be dumped to XML using
http://xstream.codehaus.org/
.
I have started to writte my own dumper, which still is
experimental, incomplete work-in-progress with some known bugs
and limitations:
class User { public int id = 0; }
public class Main
{ public static void main( final java.lang.String[] args )
{ User user = new User();
java.lang.System.out.println
( new de.dclj.ram.notation.junobjects.Junobjects().dump( user )); }}
< &objectmap
object =
< &User
id =
< &int 0 >>>
The library is avaiable at
http://www.purl.org/stefan_ram/pub/ram-jar
I know you could make one using reflection; my question is *has*
someone made one, one that is tunable (ie: that can override objects'
toString() methods, shows only so many levels of output, etc. Being
able to override toString() for subobjects is very important because
Java so helpfully provides a somewhat meaningless toString() function
for Object)
Now I see, you already knew about »toString()«!
Yes, my dumper uses reflection, but does not care about
»toString()« implementations.
However, your idea to use overriding to control the dumper
is good!
The source code of my dumper is available under the GPL as
indicated on the web site.
More examples:
The next example shows a self reference:
class Ship
{ Ship ship;
final java.lang.String a0 = "abc";
final java.lang.String a1 = "abc";
final java.lang.String a2 = new java.lang.String( a1 ); }
public class Main
{ public static void main( final java.lang.String[] args )
{ Ship ship = new Ship(); ship.ship = ship; // add self reference
java.lang.System.out.println
( new de.dclj.ram.notation.junobjects.Junobjects().dump( ship )); }}
outputs:
< &objectmap
object =
< &Ship
a0 =
< &java.lang.String zz0 >
a1 =
< &java.lang.String zz0 >
a2 =
< &java.lang.String zz1 >
ship =
< &Ship object >>
zz0 =
< &java.lang.String
count =
< &int 3 >
hash =
< &int 0 >
offset =
< &int 0 >
value =
< &[char[]] a b c >>
zz1 =
< &java.lang.String
count =
< &int 3 >
hash =
< &int 0 >
offset =
< &int 0 >
value =
< &[char[]] a b c >>>
public class Main
{ public static void main( final java.lang.String[] args )
{ final java.util.HashMap<java.lang.String,java.lang.Integer> hashMap
= new java.util.HashMap<java.lang.String,java.lang.Integer>();
hashMap.put( "a", 1 );
hashMap.put( "b", 2 );
java.lang.System.out.println
( new de.dclj.ram.notation.junobjects.Junobjects().dump( hashMap )); }}
< &objectmap
object =
< &java.util.HashMap
entrySet =
< >
loadFactor =
< &float 0.75 >
modCount =
< &int 2 >
size =
< &int 2 >
table =
< &[java.util.HashMap.Entry[]]
< null >
< null >
< null >
< null >
< &java.util.HashMap.Entry zz0 >
< null >
< null >
< &java.util.HashMap.Entry zz1 >
< null >
< null >
< null >
< null >
< null >
< null >
< null >
< null >>
threshold =
< &int 12 >>
zz0 =
< &java.util.HashMap.Entry
hash =
< &int 100 >
key =
< &java.lang.String zz2 >
next =
< >
value =
< &java.lang.Integer zz3 >>
zz1 =
< &java.util.HashMap.Entry
hash =
< &int 103 >
key =
< &java.lang.String zz4 >
next =
< >
value =
< &java.lang.Integer zz5 >>
zz2 =
< &java.lang.String
count =
< &int 1 >
hash =
< &int 98 >
offset =
< &int 0 >
value =
< &[char[]] b >>
zz3 =
< &java.lang.Integer
value =
< &int 2 >>
zz4 =
< &java.lang.String
count =
< &int 1 >
hash =
< &int 97 >
offset =
< &int 0 >
value =
< &[char[]] a >>
zz5 =
< &java.lang.Integer
value =
< &int 1 >>>
class A { final B b; final C c;
public A( final B b, final C c ){ this.b = b; this.c = c; }}
class B { final int m = 1; final java.lang.String x = "X";
final D d;
public B( final D d ){ this.d = d; }}
class C { final int n = 2; final java.lang.String y = "Y";
final D d;
public C( final D d ){ this.d = d; }} class D {}
public class Main
{ public static void main( final java.lang.String[] args )
{ final D d = new D();
final B b = new B( d );
final C c = new C( d );
final A a = new A( b, c );
java.lang.System.out.println
( new de.dclj.ram.notation.junobjects.Junobjects().dump( a )); }}
< &objectmap
object =
< &A
b =
< &B zz0 >
c =
< &C zz1 >>
zz0 =
< &B
d =
< &D zz3 >
m =
< &int 1 >
x =
< &java.lang.String zz2 >>
zz1 =
< &C
d =
< &D zz3 >
n =
< &int 2 >
y =
< &java.lang.String zz4 >>
zz2 =
< &java.lang.String
count =
< &int 1 >
hash =
< &int 0 >
offset =
< &int 0 >
value =
< &[char[]] X >>
zz3 =
< &D >
zz4 =
< &java.lang.String
count =
< &int 1 >
hash =
< &int 0 >
offset =
< &int 0 >
value =
< &[char[]] Y >>>