java-callgraph-spoon,使用静态分析工具spoon构造方法调用图callgraph ,源代码方法级别
项目开源可访问:https://github.com/nhjclxc/java-callgraph-spoon.git
函数调用图call graph,用节点vertex表示过程,用边edge表示过程之间的调用关系
使用dot格式语言表示图结构
digraph "org.nhjclxc.cg.SpoonCGProcessor.build(java.lang.String)" {
"org.nhjclxc.cg.SpoonCGProcessor.build(java.lang.String)" -> "spoon.Launcher()";
"org.nhjclxc.cg.SpoonCGProcessor.build(java.lang.String)" -> "spoon.Launcher.addInputResource(java.lang.String)";
"org.nhjclxc.cg.SpoonCGProcessor.build(java.lang.String)" -> "spoon.Launcher.addProcessor(spoon.processing.Processor)";
"org.nhjclxc.cg.SpoonCGProcessor.build(java.lang.String)" -> "spoon.Launcher.run()";
"org.nhjclxc.cg.SpoonCGVisitor.getSpoonCGNodeMap()" -> "java.util.Collection.removeIf(java.util.function.Predicate)";
"org.nhjclxc.cg.SpoonCGVisitor.getSpoonCGNodeMap()" -> "java.util.Map.entrySet()";
"org.nhjclxc.cg.SpoonCGVisitor.getSpoonCGNodeMap()" -> "java.util.Set.contains(java.lang.Object)";
"org.nhjclxc.cg.SpoonCGVisitor.getSpoonCGNodeMap()" -> "java.util.Map$Entry.getKey()";
"org.nhjclxc.cg.SpoonCGProcessor.build(java.lang.String)" -> "org.nhjclxc.cg.SpoonCGVisitor.getSpoonCGNodeMap()";
"org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.util.HashMap()";
"org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.util.Map.entrySet()";
"org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.util.Map$Entry.getKey()";
"org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.util.Map$Entry.getValue()";
"org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.lang.StringBuilder(java.lang.String)";
"org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.util.LinkedList()";
"org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)" -> "org.nhjclxc.cg.SpoonCGNode.getSpoonCGDotList()";
"org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)" -> "java.util.List.size()";
"org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)" -> "org.nhjclxc.cg.SpoonCGNode.getMethodQualifiedName()";
"org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)" -> "org.nhjclxc.cg.SpoonCGNode.getMethodQualifiedName()";
"org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)" -> "org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)";
"org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)" -> "java.util.List.add(java.lang.Object)";
"org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)";
"org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.util.List.size()";
"org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.lang.StringBuilder.append(java.lang.String)";
"org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.lang.StringBuilder.append(java.lang.String)";
"org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.util.Map.put(java.lang.Object,java.lang.Object)";
"org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.lang.String.valueOf(java.lang.Object)";
"org.nhjclxc.cg.FileUtils.writeDotFile(java.lang.String,java.util.Map)" -> "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)";
"org.nhjclxc.cg.FileUtils.writeDotFile(java.lang.String,java.util.Map)" -> "java.util.Map.entrySet()";
"org.nhjclxc.cg.FileUtils.writeDotFile(java.lang.String,java.util.Map)" -> "java.util.Map$Entry.getKey()";
"org.nhjclxc.cg.FileUtils.writeDotFile(java.lang.String,java.util.Map)" -> "java.util.Map$Entry.getValue()";
"org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)" -> "java.io.File(java.lang.String)";
"org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)" -> "java.io.File.getParentFile()";
"org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)" -> "java.io.File.exists()";
"org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)" -> "java.io.File.mkdirs()";
"org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)" -> "java.io.FileWriter(java.io.File)";
"org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)" -> "java.io.Writer.write(java.lang.String)";
"org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)" -> "java.io.OutputStreamWriter.flush()";
"org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)" -> "java.io.OutputStreamWriter.close()";
"org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)" -> "java.lang.RuntimeException(java.lang.Throwable)";
"org.nhjclxc.cg.FileUtils.writeDotFile(java.lang.String,java.util.Map)" -> "org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)";
"org.nhjclxc.cg.FileUtils.getFilePath(java.lang.String)" -> "java.util.regex.Pattern.matcher(java.lang.CharSequence)";
"org.nhjclxc.cg.FileUtils.getFilePath(java.lang.String)" -> "java.util.regex.Pattern.compile(java.lang.String)";
"org.nhjclxc.cg.FileUtils.getFilePath(java.lang.String)" -> "java.util.regex.Matcher.find()";
"org.nhjclxc.cg.FileUtils.getFilePath(java.lang.String)" -> "java.util.regex.Matcher.group(int)";
"org.nhjclxc.cg.FileUtils.getFilePath(java.lang.String)" -> "java.lang.System.currentTimeMillis()";
"org.nhjclxc.cg.FileUtils.getFilePath(java.lang.String)" -> "java.lang.String.replaceAll(java.lang.String,java.lang.String)";
"org.nhjclxc.cg.FileUtils.writeDotFile(java.lang.String,java.util.Map)" -> "org.nhjclxc.cg.FileUtils.getFilePath(java.lang.String)";
"org.nhjclxc.graphviz.GraphvizAssistant.getFilePathPerfix(java.lang.String)" -> "java.lang.String.lastIndexOf(java.lang.String)";
"org.nhjclxc.graphviz.GraphvizAssistant.getFilePathPerfix(java.lang.String)" -> "java.lang.String.substring(int,int)";
"org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)" -> "org.nhjclxc.graphviz.GraphvizAssistant.getFilePathPerfix(java.lang.String)";
"org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)" -> "java.io.File.getAbsolutePath()";
"org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)" -> "java.io.File(java.lang.String)";
"org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)" -> "java.lang.Runtime.getRuntime()";
"org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)" -> "java.io.File.getAbsolutePath()";
"org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)" -> "java.io.File.getAbsolutePath()";
"org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)" -> "java.lang.Runtime.exec(java.lang.String[])";
"org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)" -> "java.lang.Process.waitFor()";
"org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)" -> "java.lang.Throwable.printStackTrace()";
"org.nhjclxc.cg.FileUtils.writeDotFile(java.lang.String,java.util.Map)" -> "org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)";
"org.nhjclxc.cg.SpoonCGProcessor.build(java.lang.String)" -> "org.nhjclxc.cg.FileUtils.writeDotFile(java.lang.String,java.util.Map)";
"org.nhjclxc.cg.SpoonCGProcessor.build(java.lang.String)" -> "java.io.PrintStream.println(java.lang.String)";
"org.nhjclxc.cg.SpoonCGProcessor.build(java.lang.String)" -> "java.io.PrintStream.println(java.lang.String)";
"org.nhjclxc.cg.SpoonCGProcessor.build(java.lang.String)" -> "java.io.PrintStream.println(java.lang.String)";
}