:::::::::::::: A.java :::::::::::::: public class A { A(B b, C c) { this.b = b; this.c = c; } public B b; public C c; } :::::::::::::: B.java :::::::::::::: public class B { B(D d) { this.d = d; } public D d; } :::::::::::::: C.java :::::::::::::: public class C {} :::::::::::::: D.java :::::::::::::: public class D {} :::::::::::::: Main.java :::::::::::::: import EDU.neu.ccs.demeter.dj.*; class Main { public static void main(String[] args) { ClassGraph cg = new ClassGraph(); // constructed from *.java A a = new A(new B(new D()), new C()); cg.traverse(a, new StrategyGraph("A->D"), new MyVisitor()); } } :::::::::::::: MyVisitor.java :::::::::::::: import EDU.neu.ccs.demeter.dj.Visitor; public class MyVisitor extends Visitor { public void start() { System.out.println("begin"); } public void finish() { System.out.println("end"); } public void before(A o) { System.out.println("before A"); } public void after(A o) { System.out.println("after A"); } public void before(B o) { System.out.println("before B"); } public void after(B o) { System.out.println("after B"); } public void before(C o) { System.out.println("before C"); } public void after(C o) { System.out.println("after C"); } public void before(D o) { System.out.println("before D"); } public void after(D o) { System.out.println("after D"); } } :::::::::::::: output :::::::::::::: begin before A before B before D after D after B after A end