1 2 3 4 5 6 7 | package test; public class Foo { public String getSomething() { return "Hello World" ; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | package test; import javax.tools.JavaCompiler; import javax.tools.JavaFileObject; import javax.tools.StandardJavaFileManager; import javax.tools.ToolProvider; import com.sun.source.tree.ClassTree; import com.sun.source.tree.CompilationUnitTree; import com.sun.source.tree.MethodTree; import com.sun.source.tree.ReturnTree; import com.sun.source.tree.StatementTree; import com.sun.source.tree.Tree; import com.sun.source.util.JavacTask; import com.sun.source.util.SimpleTreeVisitor; public class Test { public static void main(String[] args) throws Exception { JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); StandardJavaFileManager fileManager = compiler.getStandardFileManager( null , null , null ); Iterable<? extends JavaFileObject> fileObjects = fileManager .getJavaFileObjects( "test/Foo.java" ); JavacTask javac = (JavacTask) compiler.getTask( null , fileManager, null , null , null , fileObjects); Iterable<? extends CompilationUnitTree> trees = javac.parse(); for (CompilationUnitTree tree : trees) { tree.accept( new CompilationUnitVisitor(), null ); } } static class CompilationUnitVisitor extends SimpleTreeVisitor<Void, Void> { @Override public Void visitCompilationUnit(CompilationUnitTree cut, Void p) { System.out.println( "Package name: " + cut.getPackageName()); for (Tree t : cut.getTypeDecls()) { if (t instanceof ClassTree) { ClassTree ct = (ClassTree) t; ct.accept( new ClassVisitor(), null ); } } return super .visitCompilationUnit(cut, p); } } static class ClassVisitor extends SimpleTreeVisitor<Void, Void> { @Override public Void visitClass(ClassTree ct, Void p) { System.out.println( "Class name: " + ct.getSimpleName()); for (Tree t : ct.getMembers()) { MethodTree mt = (MethodTree) t; mt.accept( new MethodVisitor(), null ); } return super .visitClass(ct, p); } } static class MethodVisitor extends SimpleTreeVisitor<Void, Void> { @Override public Void visitMethod(MethodTree mt, Void p) { System.out.println( "Method name: " + mt.getName()); for (StatementTree st : mt.getBody().getStatements()) { if (st instanceof ReturnTree) { ReturnTree rt = (ReturnTree) st; rt.accept( new ReturnTreeVisitor(), null ); } } return super .visitMethod(mt, p); } } static class ReturnTreeVisitor extends SimpleTreeVisitor<Void, Void> { @Override public Void visitReturn(ReturnTree rt, Void p) { System.out.println( "Return statement: " + rt.getExpression()); return super .visitReturn(rt, p); } } } |