├── .gitignore ├── LICENSE ├── README.md ├── java-callgraph-spoon-1.0-SNAPSHOT-jar-with-dependencies.jar ├── output └── org │ └── nhjclxc │ ├── Main │ ├── main.dot │ └── main.png │ ├── cg │ ├── CGTestFile │ │ ├── get.dot │ │ ├── get.png │ │ ├── getString1.dot │ │ ├── getString1.png │ │ ├── main.dot │ │ └── main.png │ ├── FileUtils │ │ ├── buildEdges.dot │ │ ├── buildEdges.png │ │ ├── getFilePath.dot │ │ ├── getFilePath.png │ │ ├── toDot.dot │ │ ├── toDot.png │ │ ├── write.dot │ │ ├── write.png │ │ ├── writeDotFile.dot │ │ └── writeDotFile.png │ ├── SpoonCGNode │ │ ├── appendSpoonCGDotList.dot │ │ ├── appendSpoonCGDotList.png │ │ ├── getMethodQualifiedName.dot │ │ ├── getMethodQualifiedName.png │ │ ├── getSpoonCGDotList.dot │ │ ├── getSpoonCGDotList.png │ │ ├── setMethodQualifiedName.dot │ │ ├── setMethodQualifiedName.png │ │ ├── setSpoonCGDotList.dot │ │ └── setSpoonCGDotList.png │ ├── SpoonCGProcessor │ │ ├── build.dot │ │ ├── build.png │ │ ├── build.svg │ │ ├── main.dot │ │ ├── main.png │ │ ├── process.dot │ │ └── process.png │ └── SpoonCGVisitor │ │ ├── getMethodModifier.dot │ │ ├── getMethodModifier.png │ │ ├── getMethodQualifiedName.dot │ │ ├── getMethodQualifiedName.png │ │ ├── getSpoonCGNode.dot │ │ ├── getSpoonCGNode.png │ │ ├── getSpoonCGNodeMap.dot │ │ ├── getSpoonCGNodeMap.png │ │ ├── visitCtMethod.dot │ │ └── visitCtMethod.png │ └── graphviz │ └── GraphvizAssistant │ ├── createImage.dot │ ├── createImage.png │ ├── getFilePathPerfix.dot │ └── getFilePathPerfix.png ├── pom.xml └── src └── main └── java └── org └── nhjclxc ├── Main.java ├── cg ├── CGTestFile.java ├── FileUtils.java ├── SpoonCGNode.java ├── SpoonCGProcessor.java └── SpoonCGVisitor.java └── graphviz └── GraphvizAssistant.java /.gitignore: -------------------------------------------------------------------------------- 1 | target/ 2 | !.mvn/wrapper/maven-wrapper.jar 3 | !**/src/main/**/target/ 4 | !**/src/test/**/target/ 5 | 6 | ### IntelliJ IDEA ### 7 | .idea/modules.xml 8 | .idea/jarRepositories.xml 9 | .idea/compiler.xml 10 | .idea/libraries/ 11 | *.iws 12 | *.iml 13 | *.ipr 14 | 15 | ### Eclipse ### 16 | .apt_generated 17 | .classpath 18 | .factorypath 19 | .project 20 | .settings 21 | .springBeans 22 | .sts4-cache 23 | 24 | ### NetBeans ### 25 | /nbproject/private/ 26 | /nbbuild/ 27 | /dist/ 28 | /nbdist/ 29 | /.nb-gradle/ 30 | build/ 31 | !**/src/main/**/build/ 32 | !**/src/test/**/build/ 33 | 34 | ### VS Code ### 35 | .vscode/ 36 | 37 | ### Mac OS ### 38 | .DS_Store 39 | 40 | 41 | # IntelliJ project files 42 | .idea 43 | *.iml 44 | out 45 | gen### Java template 46 | *.class 47 | 48 | 49 | # Mobile Tools for Java (J2ME) 50 | .mtj.tmp/ 51 | 52 | # Package Files # 53 | *.war 54 | *.ear 55 | 56 | # Project output Files # 57 | /spooned 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | java-callgraph-spoon 2 | ========================================= 3 | 4 | * 使用静态分析工具spoon构造方法调用图callgraph,Use spoon build method to call graph cg 5 | * 从java源代码生成java调用图,generate a java call graph from java source code 6 | * 7 | 8 | 9 | ## keywords:java、callgraph、java-callgraph、cg、static analysis、source code analysis 10 | 11 | 12 | ## run 13 | 14 | ### download 15 | `git clone https://github.com/nhjclxc/java-callgraph-spoon.git` 16 | 17 | 18 | ### 源代码方式启动 source code 19 | 导入idea的maven项目,进入 `org.nhjclxc.cg.SpoonCGProcessor.main()` ,在里面指定你要解析的java文件或是目录,之后直接启动,然后在项目顶级会出现一个`output`文件夹,dot格式的文件就在里面 20 | 21 | 22 | ### jar方式启动 java -jar 23 | 24 | - `cd java-callgraph-spoon` 25 | - `mvn clean package` 26 | - `cd target` 27 | - `java -jar java-callgraph-spoon-1.0-SNAPSHOT-jar-with-dependencies.jar path`, 28 | - 如 `java -jar java-callgraph-spoon-1.0-SNAPSHOT-jar-with-dependencies.jar "E:\nbu\other\java-callgraph-spoon\src\main\java\org\nhjclxc"` 29 | - 随后在jar包目录下会生成一个 `output` 文件夹,生成的dot格式调用图就在里面 30 | 31 | ### 结果示例 32 | 33 | [build.dot](output%2Forg%2Fnhjclxc%2Fcg%2FSpoonCGProcessor%2Fbuild.dot) 34 | ![build.png](output%2Forg%2Fnhjclxc%2Fcg%2FSpoonCGProcessor%2Fbuild.png) 35 | ![build.svg](output%2Forg%2Fnhjclxc%2Fcg%2FSpoonCGProcessor%2Fbuild.svg) 36 | 37 | 38 | ## 可视化 39 | 40 | - 访问 [Graphviz Online](https://dreampuf.github.io/GraphvizOnline) 41 | - 后期将尝试通过项目直接调用Graphviz工具生成图片,现在拿到dot的图结构其实就可以在这个基础上进行调用图的分析工作了,比如图相似性、向量化等等 42 | 43 | 44 | ## 注意 45 | - 如果提供的只是一个文件的话,只会分析该文件内部方法之间的调用。因此,建议你将要分析的java文件import里面包含的所有文件同时提供,否则生成的调用图只是单文件内部的调用关系(如果闲提供文件列表太繁琐,你可以把相关文件放到一个文件夹里面,提供文件夹路径即可构建该路径下面的所有*.java之间的函数调用关系) 46 | 47 | - 项目现在可能还不够完善,可能还存在一些分析不足的问题,后续将会补充完善 48 | 49 | 50 | ## Author 51 | 52 | - [LuoXianchao](https://github.com/nhjclxc) 53 | - . 54 | 55 | 56 | ## License 57 | 58 | - [Apache-2.0 license](https://www.apache.org/licenses/LICENSE-2.0) 59 | - 项目 Apache-2.0 license 许可证 60 | 61 | -------------------------------------------------------------------------------- /java-callgraph-spoon-1.0-SNAPSHOT-jar-with-dependencies.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhjclxc/java-callgraph-spoon/8c7727b616fb50e905ce33073ee9b6611baa6a76/java-callgraph-spoon-1.0-SNAPSHOT-jar-with-dependencies.jar -------------------------------------------------------------------------------- /output/org/nhjclxc/Main/main.dot: -------------------------------------------------------------------------------- 1 | digraph "org.nhjclxc.Main.main(java.lang.String[])" { 2 | "org.nhjclxc.Main.main(java.lang.String[])" -> "java.io.PrintStream.println(java.lang.String)"; 3 | 4 | "org.nhjclxc.Main.main(java.lang.String[])" -> "java.io.PrintStream.println(java.lang.String)"; 5 | 6 | "org.nhjclxc.Main.main(java.lang.String[])" -> "java.io.PrintStream.println(java.lang.String)"; 7 | 8 | "org.nhjclxc.Main.main(java.lang.String[])" -> "java.io.PrintStream.println(java.lang.String)"; 9 | 10 | "org.nhjclxc.Main.main(java.lang.String[])" -> "java.io.PrintStream.println(java.lang.String)"; 11 | 12 | "org.nhjclxc.Main.main(java.lang.String[])" -> "java.io.PrintStream.println(java.lang.String)"; 13 | 14 | "org.nhjclxc.Main.main(java.lang.String[])" -> "org.nhjclxc.cg.SpoonCGProcessor()"; 15 | 16 | "org.nhjclxc.Main.main(java.lang.String[])" -> "java.io.PrintStream.println(java.lang.String)"; 17 | 18 | "org.nhjclxc.Main.main(java.lang.String[])" -> "java.io.PrintStream.println(java.lang.String)"; 19 | 20 | "org.nhjclxc.cg.SpoonCGProcessor.build(java.lang.String)" -> "spoon.Launcher()"; 21 | 22 | "org.nhjclxc.cg.SpoonCGProcessor.build(java.lang.String)" -> "spoon.Launcher.addInputResource(java.lang.String)"; 23 | 24 | "org.nhjclxc.cg.SpoonCGProcessor.build(java.lang.String)" -> "spoon.Launcher.addProcessor(spoon.processing.Processor)"; 25 | 26 | "org.nhjclxc.cg.SpoonCGProcessor.build(java.lang.String)" -> "spoon.Launcher.run()"; 27 | 28 | "org.nhjclxc.cg.SpoonCGVisitor.getSpoonCGNodeMap()" -> "java.util.Collection.removeIf(java.util.function.Predicate)"; 29 | 30 | "org.nhjclxc.cg.SpoonCGVisitor.getSpoonCGNodeMap()" -> "java.util.Map.entrySet()"; 31 | 32 | "org.nhjclxc.cg.SpoonCGVisitor.getSpoonCGNodeMap()" -> "java.util.Set.contains(java.lang.Object)"; 33 | 34 | "org.nhjclxc.cg.SpoonCGVisitor.getSpoonCGNodeMap()" -> "java.util.Map$Entry.getKey()"; 35 | 36 | "org.nhjclxc.cg.SpoonCGProcessor.build(java.lang.String)" -> "org.nhjclxc.cg.SpoonCGVisitor.getSpoonCGNodeMap()"; 37 | 38 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.util.HashMap()"; 39 | 40 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.util.Map.entrySet()"; 41 | 42 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.util.Map$Entry.getKey()"; 43 | 44 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.util.Map$Entry.getValue()"; 45 | 46 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.lang.StringBuilder(java.lang.String)"; 47 | 48 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.util.LinkedList()"; 49 | 50 | "org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)" -> "org.nhjclxc.cg.SpoonCGNode.getSpoonCGDotList()"; 51 | 52 | "org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)" -> "java.util.List.size()"; 53 | 54 | "org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)" -> "org.nhjclxc.cg.SpoonCGNode.getMethodQualifiedName()"; 55 | 56 | "org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)" -> "org.nhjclxc.cg.SpoonCGNode.getMethodQualifiedName()"; 57 | 58 | "org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)" -> "org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)"; 59 | 60 | "org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)" -> "java.util.List.add(java.lang.Object)"; 61 | 62 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)"; 63 | 64 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.util.List.size()"; 65 | 66 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.lang.StringBuilder.append(java.lang.String)"; 67 | 68 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.lang.StringBuilder.append(java.lang.String)"; 69 | 70 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.util.Map.put(java.lang.Object,java.lang.Object)"; 71 | 72 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.lang.String.valueOf(java.lang.Object)"; 73 | 74 | "org.nhjclxc.cg.FileUtils.writeDotFile(java.lang.String,java.util.Map)" -> "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)"; 75 | 76 | "org.nhjclxc.cg.FileUtils.writeDotFile(java.lang.String,java.util.Map)" -> "java.util.Map.entrySet()"; 77 | 78 | "org.nhjclxc.cg.FileUtils.writeDotFile(java.lang.String,java.util.Map)" -> "java.util.Map$Entry.getKey()"; 79 | 80 | "org.nhjclxc.cg.FileUtils.writeDotFile(java.lang.String,java.util.Map)" -> "java.util.Map$Entry.getValue()"; 81 | 82 | "org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)" -> "java.io.File(java.lang.String)"; 83 | 84 | "org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)" -> "java.io.File.getParentFile()"; 85 | 86 | "org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)" -> "java.io.File.exists()"; 87 | 88 | "org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)" -> "java.io.File.mkdirs()"; 89 | 90 | "org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)" -> "java.io.FileWriter(java.io.File)"; 91 | 92 | "org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)" -> "java.io.Writer.write(java.lang.String)"; 93 | 94 | "org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)" -> "java.io.OutputStreamWriter.flush()"; 95 | 96 | "org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)" -> "java.io.OutputStreamWriter.close()"; 97 | 98 | "org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)" -> "java.lang.RuntimeException(java.lang.Throwable)"; 99 | 100 | "org.nhjclxc.cg.FileUtils.writeDotFile(java.lang.String,java.util.Map)" -> "org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)"; 101 | 102 | "org.nhjclxc.cg.FileUtils.getFilePath(java.lang.String)" -> "java.util.regex.Pattern.matcher(java.lang.CharSequence)"; 103 | 104 | "org.nhjclxc.cg.FileUtils.getFilePath(java.lang.String)" -> "java.util.regex.Pattern.compile(java.lang.String)"; 105 | 106 | "org.nhjclxc.cg.FileUtils.getFilePath(java.lang.String)" -> "java.util.regex.Matcher.find()"; 107 | 108 | "org.nhjclxc.cg.FileUtils.getFilePath(java.lang.String)" -> "java.util.regex.Matcher.group(int)"; 109 | 110 | "org.nhjclxc.cg.FileUtils.getFilePath(java.lang.String)" -> "java.lang.System.currentTimeMillis()"; 111 | 112 | "org.nhjclxc.cg.FileUtils.getFilePath(java.lang.String)" -> "java.lang.String.replaceAll(java.lang.String,java.lang.String)"; 113 | 114 | "org.nhjclxc.cg.FileUtils.writeDotFile(java.lang.String,java.util.Map)" -> "org.nhjclxc.cg.FileUtils.getFilePath(java.lang.String)"; 115 | 116 | "org.nhjclxc.graphviz.GraphvizAssistant.getFilePathPerfix(java.lang.String)" -> "java.lang.String.lastIndexOf(java.lang.String)"; 117 | 118 | "org.nhjclxc.graphviz.GraphvizAssistant.getFilePathPerfix(java.lang.String)" -> "java.lang.String.substring(int,int)"; 119 | 120 | "org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)" -> "org.nhjclxc.graphviz.GraphvizAssistant.getFilePathPerfix(java.lang.String)"; 121 | 122 | "org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)" -> "java.io.File.getAbsolutePath()"; 123 | 124 | "org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)" -> "java.io.File(java.lang.String)"; 125 | 126 | "org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)" -> "java.lang.Runtime.getRuntime()"; 127 | 128 | "org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)" -> "java.io.File.getAbsolutePath()"; 129 | 130 | "org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)" -> "java.io.File.getAbsolutePath()"; 131 | 132 | "org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)" -> "java.lang.Runtime.exec(java.lang.String[])"; 133 | 134 | "org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)" -> "java.lang.Process.waitFor()"; 135 | 136 | "org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)" -> "java.lang.Throwable.printStackTrace()"; 137 | 138 | "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)"; 139 | 140 | "org.nhjclxc.cg.SpoonCGProcessor.build(java.lang.String)" -> "org.nhjclxc.cg.FileUtils.writeDotFile(java.lang.String,java.util.Map)"; 141 | 142 | "org.nhjclxc.cg.SpoonCGProcessor.build(java.lang.String)" -> "java.io.PrintStream.println(java.lang.String)"; 143 | 144 | "org.nhjclxc.cg.SpoonCGProcessor.build(java.lang.String)" -> "java.io.PrintStream.println(java.lang.String)"; 145 | 146 | "org.nhjclxc.cg.SpoonCGProcessor.build(java.lang.String)" -> "java.io.PrintStream.println(java.lang.String)"; 147 | 148 | "org.nhjclxc.Main.main(java.lang.String[])" -> "org.nhjclxc.cg.SpoonCGProcessor.build(java.lang.String)"; 149 | 150 | } -------------------------------------------------------------------------------- /output/org/nhjclxc/Main/main.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhjclxc/java-callgraph-spoon/8c7727b616fb50e905ce33073ee9b6611baa6a76/output/org/nhjclxc/Main/main.png -------------------------------------------------------------------------------- /output/org/nhjclxc/cg/CGTestFile/get.dot: -------------------------------------------------------------------------------- 1 | digraph "org.nhjclxc.cg.CGTestFile.get(java.lang.String,java.lang.Integer,org.nhjclxc.cg.ReturnTestClass)" { 2 | "org.nhjclxc.cg.CGTestFile.get(java.lang.String,java.lang.Integer,org.nhjclxc.cg.ReturnTestClass)" -> "java.io.PrintStream.println(java.lang.String)"; 3 | 4 | "org.nhjclxc.cg.CGTestFile.get(java.lang.String,java.lang.Integer,org.nhjclxc.cg.ReturnTestClass)" -> "java.util.LinkedList()"; 5 | 6 | } -------------------------------------------------------------------------------- /output/org/nhjclxc/cg/CGTestFile/get.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhjclxc/java-callgraph-spoon/8c7727b616fb50e905ce33073ee9b6611baa6a76/output/org/nhjclxc/cg/CGTestFile/get.png -------------------------------------------------------------------------------- /output/org/nhjclxc/cg/CGTestFile/getString1.dot: -------------------------------------------------------------------------------- 1 | digraph "org.nhjclxc.cg.CGTestFile.getString1(java.lang.Integer,org.nhjclxc.cg.ReturnTestClass)" { 2 | "org.nhjclxc.cg.CGTestFile.getString1(java.lang.Integer,org.nhjclxc.cg.ReturnTestClass)" -> "java.io.PrintStream.println(java.lang.String)"; 3 | 4 | "org.nhjclxc.cg.CGTestFile.get(java.lang.String,java.lang.Integer,org.nhjclxc.cg.ReturnTestClass)" -> "java.io.PrintStream.println(java.lang.String)"; 5 | 6 | "org.nhjclxc.cg.CGTestFile.get(java.lang.String,java.lang.Integer,org.nhjclxc.cg.ReturnTestClass)" -> "java.util.LinkedList()"; 7 | 8 | "org.nhjclxc.cg.CGTestFile.getString1(java.lang.Integer,org.nhjclxc.cg.ReturnTestClass)" -> "org.nhjclxc.cg.CGTestFile.get(java.lang.String,java.lang.Integer,org.nhjclxc.cg.ReturnTestClass)"; 9 | 10 | } -------------------------------------------------------------------------------- /output/org/nhjclxc/cg/CGTestFile/getString1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhjclxc/java-callgraph-spoon/8c7727b616fb50e905ce33073ee9b6611baa6a76/output/org/nhjclxc/cg/CGTestFile/getString1.png -------------------------------------------------------------------------------- /output/org/nhjclxc/cg/CGTestFile/main.dot: -------------------------------------------------------------------------------- 1 | digraph "org.nhjclxc.cg.CGTestFile.main(java.lang.String[])" { 2 | } -------------------------------------------------------------------------------- /output/org/nhjclxc/cg/CGTestFile/main.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhjclxc/java-callgraph-spoon/8c7727b616fb50e905ce33073ee9b6611baa6a76/output/org/nhjclxc/cg/CGTestFile/main.png -------------------------------------------------------------------------------- /output/org/nhjclxc/cg/FileUtils/buildEdges.dot: -------------------------------------------------------------------------------- 1 | digraph "org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)" { 2 | "org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)" -> "org.nhjclxc.cg.SpoonCGNode.getSpoonCGDotList()"; 3 | 4 | "org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)" -> "java.util.List.size()"; 5 | 6 | "org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)" -> "org.nhjclxc.cg.SpoonCGNode.getMethodQualifiedName()"; 7 | 8 | "org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)" -> "org.nhjclxc.cg.SpoonCGNode.getMethodQualifiedName()"; 9 | 10 | "org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)" -> "org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)"; 11 | 12 | "org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)" -> "java.util.List.add(java.lang.Object)"; 13 | 14 | } -------------------------------------------------------------------------------- /output/org/nhjclxc/cg/FileUtils/buildEdges.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhjclxc/java-callgraph-spoon/8c7727b616fb50e905ce33073ee9b6611baa6a76/output/org/nhjclxc/cg/FileUtils/buildEdges.png -------------------------------------------------------------------------------- /output/org/nhjclxc/cg/FileUtils/getFilePath.dot: -------------------------------------------------------------------------------- 1 | digraph "org.nhjclxc.cg.FileUtils.getFilePath(java.lang.String)" { 2 | "org.nhjclxc.cg.FileUtils.getFilePath(java.lang.String)" -> "java.util.regex.Pattern.matcher(java.lang.CharSequence)"; 3 | 4 | "org.nhjclxc.cg.FileUtils.getFilePath(java.lang.String)" -> "java.util.regex.Pattern.compile(java.lang.String)"; 5 | 6 | "org.nhjclxc.cg.FileUtils.getFilePath(java.lang.String)" -> "java.util.regex.Matcher.find()"; 7 | 8 | "org.nhjclxc.cg.FileUtils.getFilePath(java.lang.String)" -> "java.util.regex.Matcher.group(int)"; 9 | 10 | "org.nhjclxc.cg.FileUtils.getFilePath(java.lang.String)" -> "java.lang.System.currentTimeMillis()"; 11 | 12 | "org.nhjclxc.cg.FileUtils.getFilePath(java.lang.String)" -> "java.lang.String.replaceAll(java.lang.String,java.lang.String)"; 13 | 14 | } -------------------------------------------------------------------------------- /output/org/nhjclxc/cg/FileUtils/getFilePath.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhjclxc/java-callgraph-spoon/8c7727b616fb50e905ce33073ee9b6611baa6a76/output/org/nhjclxc/cg/FileUtils/getFilePath.png -------------------------------------------------------------------------------- /output/org/nhjclxc/cg/FileUtils/toDot.dot: -------------------------------------------------------------------------------- 1 | digraph "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" { 2 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.util.HashMap()"; 3 | 4 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.util.Map.entrySet()"; 5 | 6 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.util.Map$Entry.getKey()"; 7 | 8 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.util.Map$Entry.getValue()"; 9 | 10 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.lang.StringBuilder(java.lang.String)"; 11 | 12 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.util.LinkedList()"; 13 | 14 | "org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)" -> "org.nhjclxc.cg.SpoonCGNode.getSpoonCGDotList()"; 15 | 16 | "org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)" -> "java.util.List.size()"; 17 | 18 | "org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)" -> "org.nhjclxc.cg.SpoonCGNode.getMethodQualifiedName()"; 19 | 20 | "org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)" -> "org.nhjclxc.cg.SpoonCGNode.getMethodQualifiedName()"; 21 | 22 | "org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)" -> "org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)"; 23 | 24 | "org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)" -> "java.util.List.add(java.lang.Object)"; 25 | 26 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)"; 27 | 28 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.util.List.size()"; 29 | 30 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.lang.StringBuilder.append(java.lang.String)"; 31 | 32 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.lang.StringBuilder.append(java.lang.String)"; 33 | 34 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.util.Map.put(java.lang.Object,java.lang.Object)"; 35 | 36 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.lang.String.valueOf(java.lang.Object)"; 37 | 38 | } -------------------------------------------------------------------------------- /output/org/nhjclxc/cg/FileUtils/toDot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhjclxc/java-callgraph-spoon/8c7727b616fb50e905ce33073ee9b6611baa6a76/output/org/nhjclxc/cg/FileUtils/toDot.png -------------------------------------------------------------------------------- /output/org/nhjclxc/cg/FileUtils/write.dot: -------------------------------------------------------------------------------- 1 | digraph "org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)" { 2 | "org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)" -> "java.io.File(java.lang.String)"; 3 | 4 | "org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)" -> "java.io.File.getParentFile()"; 5 | 6 | "org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)" -> "java.io.File.exists()"; 7 | 8 | "org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)" -> "java.io.File.mkdirs()"; 9 | 10 | "org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)" -> "java.io.FileWriter(java.io.File)"; 11 | 12 | "org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)" -> "java.io.Writer.write(java.lang.String)"; 13 | 14 | "org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)" -> "java.io.OutputStreamWriter.flush()"; 15 | 16 | "org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)" -> "java.io.OutputStreamWriter.close()"; 17 | 18 | "org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)" -> "java.lang.RuntimeException(java.lang.Throwable)"; 19 | 20 | } -------------------------------------------------------------------------------- /output/org/nhjclxc/cg/FileUtils/write.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhjclxc/java-callgraph-spoon/8c7727b616fb50e905ce33073ee9b6611baa6a76/output/org/nhjclxc/cg/FileUtils/write.png -------------------------------------------------------------------------------- /output/org/nhjclxc/cg/FileUtils/writeDotFile.dot: -------------------------------------------------------------------------------- 1 | digraph "org.nhjclxc.cg.FileUtils.writeDotFile(java.lang.String,java.util.Map)" { 2 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.util.HashMap()"; 3 | 4 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.util.Map.entrySet()"; 5 | 6 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.util.Map$Entry.getKey()"; 7 | 8 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.util.Map$Entry.getValue()"; 9 | 10 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.lang.StringBuilder(java.lang.String)"; 11 | 12 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.util.LinkedList()"; 13 | 14 | "org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)" -> "org.nhjclxc.cg.SpoonCGNode.getSpoonCGDotList()"; 15 | 16 | "org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)" -> "java.util.List.size()"; 17 | 18 | "org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)" -> "org.nhjclxc.cg.SpoonCGNode.getMethodQualifiedName()"; 19 | 20 | "org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)" -> "org.nhjclxc.cg.SpoonCGNode.getMethodQualifiedName()"; 21 | 22 | "org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)" -> "org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)"; 23 | 24 | "org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)" -> "java.util.List.add(java.lang.Object)"; 25 | 26 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)"; 27 | 28 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.util.List.size()"; 29 | 30 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.lang.StringBuilder.append(java.lang.String)"; 31 | 32 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.lang.StringBuilder.append(java.lang.String)"; 33 | 34 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.util.Map.put(java.lang.Object,java.lang.Object)"; 35 | 36 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.lang.String.valueOf(java.lang.Object)"; 37 | 38 | "org.nhjclxc.cg.FileUtils.writeDotFile(java.lang.String,java.util.Map)" -> "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)"; 39 | 40 | "org.nhjclxc.cg.FileUtils.writeDotFile(java.lang.String,java.util.Map)" -> "java.util.Map.entrySet()"; 41 | 42 | "org.nhjclxc.cg.FileUtils.writeDotFile(java.lang.String,java.util.Map)" -> "java.util.Map$Entry.getKey()"; 43 | 44 | "org.nhjclxc.cg.FileUtils.writeDotFile(java.lang.String,java.util.Map)" -> "java.util.Map$Entry.getValue()"; 45 | 46 | "org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)" -> "java.io.File(java.lang.String)"; 47 | 48 | "org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)" -> "java.io.File.getParentFile()"; 49 | 50 | "org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)" -> "java.io.File.exists()"; 51 | 52 | "org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)" -> "java.io.File.mkdirs()"; 53 | 54 | "org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)" -> "java.io.FileWriter(java.io.File)"; 55 | 56 | "org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)" -> "java.io.Writer.write(java.lang.String)"; 57 | 58 | "org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)" -> "java.io.OutputStreamWriter.flush()"; 59 | 60 | "org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)" -> "java.io.OutputStreamWriter.close()"; 61 | 62 | "org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)" -> "java.lang.RuntimeException(java.lang.Throwable)"; 63 | 64 | "org.nhjclxc.cg.FileUtils.writeDotFile(java.lang.String,java.util.Map)" -> "org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)"; 65 | 66 | "org.nhjclxc.cg.FileUtils.getFilePath(java.lang.String)" -> "java.util.regex.Pattern.matcher(java.lang.CharSequence)"; 67 | 68 | "org.nhjclxc.cg.FileUtils.getFilePath(java.lang.String)" -> "java.util.regex.Pattern.compile(java.lang.String)"; 69 | 70 | "org.nhjclxc.cg.FileUtils.getFilePath(java.lang.String)" -> "java.util.regex.Matcher.find()"; 71 | 72 | "org.nhjclxc.cg.FileUtils.getFilePath(java.lang.String)" -> "java.util.regex.Matcher.group(int)"; 73 | 74 | "org.nhjclxc.cg.FileUtils.getFilePath(java.lang.String)" -> "java.lang.System.currentTimeMillis()"; 75 | 76 | "org.nhjclxc.cg.FileUtils.getFilePath(java.lang.String)" -> "java.lang.String.replaceAll(java.lang.String,java.lang.String)"; 77 | 78 | "org.nhjclxc.cg.FileUtils.writeDotFile(java.lang.String,java.util.Map)" -> "org.nhjclxc.cg.FileUtils.getFilePath(java.lang.String)"; 79 | 80 | "org.nhjclxc.graphviz.GraphvizAssistant.getFilePathPerfix(java.lang.String)" -> "java.lang.String.lastIndexOf(java.lang.String)"; 81 | 82 | "org.nhjclxc.graphviz.GraphvizAssistant.getFilePathPerfix(java.lang.String)" -> "java.lang.String.substring(int,int)"; 83 | 84 | "org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)" -> "org.nhjclxc.graphviz.GraphvizAssistant.getFilePathPerfix(java.lang.String)"; 85 | 86 | "org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)" -> "java.io.File.getAbsolutePath()"; 87 | 88 | "org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)" -> "java.io.File(java.lang.String)"; 89 | 90 | "org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)" -> "java.lang.Runtime.getRuntime()"; 91 | 92 | "org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)" -> "java.io.File.getAbsolutePath()"; 93 | 94 | "org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)" -> "java.io.File.getAbsolutePath()"; 95 | 96 | "org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)" -> "java.lang.Runtime.exec(java.lang.String[])"; 97 | 98 | "org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)" -> "java.lang.Process.waitFor()"; 99 | 100 | "org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)" -> "java.lang.Throwable.printStackTrace()"; 101 | 102 | "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)"; 103 | 104 | } -------------------------------------------------------------------------------- /output/org/nhjclxc/cg/FileUtils/writeDotFile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhjclxc/java-callgraph-spoon/8c7727b616fb50e905ce33073ee9b6611baa6a76/output/org/nhjclxc/cg/FileUtils/writeDotFile.png -------------------------------------------------------------------------------- /output/org/nhjclxc/cg/SpoonCGNode/appendSpoonCGDotList.dot: -------------------------------------------------------------------------------- 1 | digraph "org.nhjclxc.cg.SpoonCGNode.appendSpoonCGDotList(org.nhjclxc.cg.SpoonCGNode)" { 2 | "org.nhjclxc.cg.SpoonCGNode.appendSpoonCGDotList(org.nhjclxc.cg.SpoonCGNode)" -> "java.util.List.add(java.lang.Object)"; 3 | 4 | } -------------------------------------------------------------------------------- /output/org/nhjclxc/cg/SpoonCGNode/appendSpoonCGDotList.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhjclxc/java-callgraph-spoon/8c7727b616fb50e905ce33073ee9b6611baa6a76/output/org/nhjclxc/cg/SpoonCGNode/appendSpoonCGDotList.png -------------------------------------------------------------------------------- /output/org/nhjclxc/cg/SpoonCGNode/getMethodQualifiedName.dot: -------------------------------------------------------------------------------- 1 | digraph "org.nhjclxc.cg.SpoonCGNode.getMethodQualifiedName()" { 2 | } -------------------------------------------------------------------------------- /output/org/nhjclxc/cg/SpoonCGNode/getMethodQualifiedName.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhjclxc/java-callgraph-spoon/8c7727b616fb50e905ce33073ee9b6611baa6a76/output/org/nhjclxc/cg/SpoonCGNode/getMethodQualifiedName.png -------------------------------------------------------------------------------- /output/org/nhjclxc/cg/SpoonCGNode/getSpoonCGDotList.dot: -------------------------------------------------------------------------------- 1 | digraph "org.nhjclxc.cg.SpoonCGNode.getSpoonCGDotList()" { 2 | } -------------------------------------------------------------------------------- /output/org/nhjclxc/cg/SpoonCGNode/getSpoonCGDotList.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhjclxc/java-callgraph-spoon/8c7727b616fb50e905ce33073ee9b6611baa6a76/output/org/nhjclxc/cg/SpoonCGNode/getSpoonCGDotList.png -------------------------------------------------------------------------------- /output/org/nhjclxc/cg/SpoonCGNode/setMethodQualifiedName.dot: -------------------------------------------------------------------------------- 1 | digraph "org.nhjclxc.cg.SpoonCGNode.setMethodQualifiedName(java.lang.String)" { 2 | } -------------------------------------------------------------------------------- /output/org/nhjclxc/cg/SpoonCGNode/setMethodQualifiedName.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhjclxc/java-callgraph-spoon/8c7727b616fb50e905ce33073ee9b6611baa6a76/output/org/nhjclxc/cg/SpoonCGNode/setMethodQualifiedName.png -------------------------------------------------------------------------------- /output/org/nhjclxc/cg/SpoonCGNode/setSpoonCGDotList.dot: -------------------------------------------------------------------------------- 1 | digraph "org.nhjclxc.cg.SpoonCGNode.setSpoonCGDotList(java.util.List)" { 2 | } -------------------------------------------------------------------------------- /output/org/nhjclxc/cg/SpoonCGNode/setSpoonCGDotList.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhjclxc/java-callgraph-spoon/8c7727b616fb50e905ce33073ee9b6611baa6a76/output/org/nhjclxc/cg/SpoonCGNode/setSpoonCGDotList.png -------------------------------------------------------------------------------- /output/org/nhjclxc/cg/SpoonCGProcessor/build.dot: -------------------------------------------------------------------------------- 1 | digraph "org.nhjclxc.cg.SpoonCGProcessor.build(java.lang.String)" { 2 | "org.nhjclxc.cg.SpoonCGProcessor.build(java.lang.String)" -> "spoon.Launcher()"; 3 | 4 | "org.nhjclxc.cg.SpoonCGProcessor.build(java.lang.String)" -> "spoon.Launcher.addInputResource(java.lang.String)"; 5 | 6 | "org.nhjclxc.cg.SpoonCGProcessor.build(java.lang.String)" -> "spoon.Launcher.addProcessor(spoon.processing.Processor)"; 7 | 8 | "org.nhjclxc.cg.SpoonCGProcessor.build(java.lang.String)" -> "spoon.Launcher.run()"; 9 | 10 | "org.nhjclxc.cg.SpoonCGVisitor.getSpoonCGNodeMap()" -> "java.util.Collection.removeIf(java.util.function.Predicate)"; 11 | 12 | "org.nhjclxc.cg.SpoonCGVisitor.getSpoonCGNodeMap()" -> "java.util.Map.entrySet()"; 13 | 14 | "org.nhjclxc.cg.SpoonCGVisitor.getSpoonCGNodeMap()" -> "java.util.Set.contains(java.lang.Object)"; 15 | 16 | "org.nhjclxc.cg.SpoonCGVisitor.getSpoonCGNodeMap()" -> "java.util.Map$Entry.getKey()"; 17 | 18 | "org.nhjclxc.cg.SpoonCGProcessor.build(java.lang.String)" -> "org.nhjclxc.cg.SpoonCGVisitor.getSpoonCGNodeMap()"; 19 | 20 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.util.HashMap()"; 21 | 22 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.util.Map.entrySet()"; 23 | 24 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.util.Map$Entry.getKey()"; 25 | 26 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.util.Map$Entry.getValue()"; 27 | 28 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.lang.StringBuilder(java.lang.String)"; 29 | 30 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.util.LinkedList()"; 31 | 32 | "org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)" -> "org.nhjclxc.cg.SpoonCGNode.getSpoonCGDotList()"; 33 | 34 | "org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)" -> "java.util.List.size()"; 35 | 36 | "org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)" -> "org.nhjclxc.cg.SpoonCGNode.getMethodQualifiedName()"; 37 | 38 | "org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)" -> "org.nhjclxc.cg.SpoonCGNode.getMethodQualifiedName()"; 39 | 40 | "org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)" -> "org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)"; 41 | 42 | "org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)" -> "java.util.List.add(java.lang.Object)"; 43 | 44 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)"; 45 | 46 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.util.List.size()"; 47 | 48 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.lang.StringBuilder.append(java.lang.String)"; 49 | 50 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.lang.StringBuilder.append(java.lang.String)"; 51 | 52 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.util.Map.put(java.lang.Object,java.lang.Object)"; 53 | 54 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.lang.String.valueOf(java.lang.Object)"; 55 | 56 | "org.nhjclxc.cg.FileUtils.writeDotFile(java.lang.String,java.util.Map)" -> "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)"; 57 | 58 | "org.nhjclxc.cg.FileUtils.writeDotFile(java.lang.String,java.util.Map)" -> "java.util.Map.entrySet()"; 59 | 60 | "org.nhjclxc.cg.FileUtils.writeDotFile(java.lang.String,java.util.Map)" -> "java.util.Map$Entry.getKey()"; 61 | 62 | "org.nhjclxc.cg.FileUtils.writeDotFile(java.lang.String,java.util.Map)" -> "java.util.Map$Entry.getValue()"; 63 | 64 | "org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)" -> "java.io.File(java.lang.String)"; 65 | 66 | "org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)" -> "java.io.File.getParentFile()"; 67 | 68 | "org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)" -> "java.io.File.exists()"; 69 | 70 | "org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)" -> "java.io.File.mkdirs()"; 71 | 72 | "org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)" -> "java.io.FileWriter(java.io.File)"; 73 | 74 | "org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)" -> "java.io.Writer.write(java.lang.String)"; 75 | 76 | "org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)" -> "java.io.OutputStreamWriter.flush()"; 77 | 78 | "org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)" -> "java.io.OutputStreamWriter.close()"; 79 | 80 | "org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)" -> "java.lang.RuntimeException(java.lang.Throwable)"; 81 | 82 | "org.nhjclxc.cg.FileUtils.writeDotFile(java.lang.String,java.util.Map)" -> "org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)"; 83 | 84 | "org.nhjclxc.cg.FileUtils.getFilePath(java.lang.String)" -> "java.util.regex.Pattern.matcher(java.lang.CharSequence)"; 85 | 86 | "org.nhjclxc.cg.FileUtils.getFilePath(java.lang.String)" -> "java.util.regex.Pattern.compile(java.lang.String)"; 87 | 88 | "org.nhjclxc.cg.FileUtils.getFilePath(java.lang.String)" -> "java.util.regex.Matcher.find()"; 89 | 90 | "org.nhjclxc.cg.FileUtils.getFilePath(java.lang.String)" -> "java.util.regex.Matcher.group(int)"; 91 | 92 | "org.nhjclxc.cg.FileUtils.getFilePath(java.lang.String)" -> "java.lang.System.currentTimeMillis()"; 93 | 94 | "org.nhjclxc.cg.FileUtils.getFilePath(java.lang.String)" -> "java.lang.String.replaceAll(java.lang.String,java.lang.String)"; 95 | 96 | "org.nhjclxc.cg.FileUtils.writeDotFile(java.lang.String,java.util.Map)" -> "org.nhjclxc.cg.FileUtils.getFilePath(java.lang.String)"; 97 | 98 | "org.nhjclxc.graphviz.GraphvizAssistant.getFilePathPerfix(java.lang.String)" -> "java.lang.String.lastIndexOf(java.lang.String)"; 99 | 100 | "org.nhjclxc.graphviz.GraphvizAssistant.getFilePathPerfix(java.lang.String)" -> "java.lang.String.substring(int,int)"; 101 | 102 | "org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)" -> "org.nhjclxc.graphviz.GraphvizAssistant.getFilePathPerfix(java.lang.String)"; 103 | 104 | "org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)" -> "java.io.File.getAbsolutePath()"; 105 | 106 | "org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)" -> "java.io.File(java.lang.String)"; 107 | 108 | "org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)" -> "java.lang.Runtime.getRuntime()"; 109 | 110 | "org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)" -> "java.io.File.getAbsolutePath()"; 111 | 112 | "org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)" -> "java.io.File.getAbsolutePath()"; 113 | 114 | "org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)" -> "java.lang.Runtime.exec(java.lang.String[])"; 115 | 116 | "org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)" -> "java.lang.Process.waitFor()"; 117 | 118 | "org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)" -> "java.lang.Throwable.printStackTrace()"; 119 | 120 | "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)"; 121 | 122 | "org.nhjclxc.cg.SpoonCGProcessor.build(java.lang.String)" -> "org.nhjclxc.cg.FileUtils.writeDotFile(java.lang.String,java.util.Map)"; 123 | 124 | "org.nhjclxc.cg.SpoonCGProcessor.build(java.lang.String)" -> "java.io.PrintStream.println(java.lang.String)"; 125 | 126 | "org.nhjclxc.cg.SpoonCGProcessor.build(java.lang.String)" -> "java.io.PrintStream.println(java.lang.String)"; 127 | 128 | "org.nhjclxc.cg.SpoonCGProcessor.build(java.lang.String)" -> "java.io.PrintStream.println(java.lang.String)"; 129 | 130 | } -------------------------------------------------------------------------------- /output/org/nhjclxc/cg/SpoonCGProcessor/build.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhjclxc/java-callgraph-spoon/8c7727b616fb50e905ce33073ee9b6611baa6a76/output/org/nhjclxc/cg/SpoonCGProcessor/build.png -------------------------------------------------------------------------------- /output/org/nhjclxc/cg/SpoonCGProcessor/build.svg: -------------------------------------------------------------------------------- 1 | 3 | 4 | org.nhjclxc.cg.SpoonCGProcessor.build(java.lang.String) 5 | 6 | 7 | 8 | org.nhjclxc.cg.SpoonCGProcessor.build(java.lang.String) 9 | 10 | org.nhjclxc.cg.SpoonCGProcessor.build(java.lang.String) 11 | 12 | 13 | 14 | spoon.Launcher() 15 | 16 | spoon.Launcher() 17 | 18 | 19 | 20 | org.nhjclxc.cg.SpoonCGProcessor.build(java.lang.String)->spoon.Launcher() 21 | 22 | 23 | 24 | 25 | 26 | spoon.Launcher.addInputResource(java.lang.String) 27 | 28 | spoon.Launcher.addInputResource(java.lang.String) 29 | 30 | 31 | 32 | org.nhjclxc.cg.SpoonCGProcessor.build(java.lang.String)->spoon.Launcher.addInputResource(java.lang.String) 33 | 34 | 35 | 36 | 37 | 38 | spoon.Launcher.addProcessor(spoon.processing.Processor) 39 | 40 | spoon.Launcher.addProcessor(spoon.processing.Processor) 41 | 42 | 43 | 44 | org.nhjclxc.cg.SpoonCGProcessor.build(java.lang.String)->spoon.Launcher.addProcessor(spoon.processing.Processor) 45 | 46 | 47 | 48 | 49 | 50 | spoon.Launcher.run() 51 | 52 | spoon.Launcher.run() 53 | 54 | 55 | 56 | org.nhjclxc.cg.SpoonCGProcessor.build(java.lang.String)->spoon.Launcher.run() 57 | 58 | 59 | 60 | 61 | 62 | org.nhjclxc.cg.SpoonCGVisitor.getSpoonCGNodeMap() 63 | 64 | org.nhjclxc.cg.SpoonCGVisitor.getSpoonCGNodeMap() 65 | 66 | 67 | 68 | org.nhjclxc.cg.SpoonCGProcessor.build(java.lang.String)->org.nhjclxc.cg.SpoonCGVisitor.getSpoonCGNodeMap() 69 | 70 | 71 | 72 | 73 | 74 | org.nhjclxc.cg.FileUtils.writeDotFile(java.lang.String,java.util.Map) 75 | 76 | org.nhjclxc.cg.FileUtils.writeDotFile(java.lang.String,java.util.Map) 77 | 78 | 79 | 80 | org.nhjclxc.cg.SpoonCGProcessor.build(java.lang.String)->org.nhjclxc.cg.FileUtils.writeDotFile(java.lang.String,java.util.Map) 81 | 82 | 83 | 84 | 85 | 86 | java.io.PrintStream.println(java.lang.String) 87 | 88 | java.io.PrintStream.println(java.lang.String) 89 | 90 | 91 | 92 | org.nhjclxc.cg.SpoonCGProcessor.build(java.lang.String)->java.io.PrintStream.println(java.lang.String) 93 | 94 | 95 | 96 | 97 | 98 | org.nhjclxc.cg.SpoonCGProcessor.build(java.lang.String)->java.io.PrintStream.println(java.lang.String) 99 | 100 | 101 | 102 | 103 | 104 | org.nhjclxc.cg.SpoonCGProcessor.build(java.lang.String)->java.io.PrintStream.println(java.lang.String) 105 | 106 | 107 | 108 | 109 | 110 | java.util.Collection.removeIf(java.util.function.Predicate) 111 | 112 | java.util.Collection.removeIf(java.util.function.Predicate) 113 | 114 | 115 | 116 | org.nhjclxc.cg.SpoonCGVisitor.getSpoonCGNodeMap()->java.util.Collection.removeIf(java.util.function.Predicate) 117 | 118 | 119 | 120 | 121 | 122 | java.util.Map.entrySet() 123 | 124 | java.util.Map.entrySet() 125 | 126 | 127 | 128 | org.nhjclxc.cg.SpoonCGVisitor.getSpoonCGNodeMap()->java.util.Map.entrySet() 129 | 130 | 131 | 132 | 133 | 134 | java.util.Set.contains(java.lang.Object) 135 | 136 | java.util.Set.contains(java.lang.Object) 137 | 138 | 139 | 140 | org.nhjclxc.cg.SpoonCGVisitor.getSpoonCGNodeMap()->java.util.Set.contains(java.lang.Object) 141 | 142 | 143 | 144 | 145 | 146 | java.util.Map$Entry.getKey() 147 | 148 | java.util.Map$Entry.getKey() 149 | 150 | 151 | 152 | org.nhjclxc.cg.SpoonCGVisitor.getSpoonCGNodeMap()->java.util.Map$Entry.getKey() 153 | 154 | 155 | 156 | 157 | 158 | org.nhjclxc.cg.FileUtils.toDot(java.util.Map) 159 | 160 | org.nhjclxc.cg.FileUtils.toDot(java.util.Map) 161 | 162 | 163 | 164 | org.nhjclxc.cg.FileUtils.toDot(java.util.Map)->java.util.Map.entrySet() 165 | 166 | 167 | 168 | 169 | 170 | org.nhjclxc.cg.FileUtils.toDot(java.util.Map)->java.util.Map$Entry.getKey() 171 | 172 | 173 | 174 | 175 | 176 | java.util.HashMap() 177 | 178 | java.util.HashMap() 179 | 180 | 181 | 182 | org.nhjclxc.cg.FileUtils.toDot(java.util.Map)->java.util.HashMap() 183 | 184 | 185 | 186 | 187 | 188 | java.util.Map$Entry.getValue() 189 | 190 | java.util.Map$Entry.getValue() 191 | 192 | 193 | 194 | org.nhjclxc.cg.FileUtils.toDot(java.util.Map)->java.util.Map$Entry.getValue() 195 | 196 | 197 | 198 | 199 | 200 | java.lang.StringBuilder(java.lang.String) 201 | 202 | java.lang.StringBuilder(java.lang.String) 203 | 204 | 205 | 206 | org.nhjclxc.cg.FileUtils.toDot(java.util.Map)->java.lang.StringBuilder(java.lang.String) 207 | 208 | 209 | 210 | 211 | 212 | java.util.LinkedList() 213 | 214 | java.util.LinkedList() 215 | 216 | 217 | 218 | org.nhjclxc.cg.FileUtils.toDot(java.util.Map)->java.util.LinkedList() 219 | 220 | 221 | 222 | 223 | 224 | org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List) 225 | 226 | org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List) 227 | 228 | 229 | 230 | org.nhjclxc.cg.FileUtils.toDot(java.util.Map)->org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List) 231 | 232 | 233 | 234 | 235 | 236 | java.util.List.size() 237 | 238 | java.util.List.size() 239 | 240 | 241 | 242 | org.nhjclxc.cg.FileUtils.toDot(java.util.Map)->java.util.List.size() 243 | 244 | 245 | 246 | 247 | 248 | java.lang.StringBuilder.append(java.lang.String) 249 | 250 | java.lang.StringBuilder.append(java.lang.String) 251 | 252 | 253 | 254 | org.nhjclxc.cg.FileUtils.toDot(java.util.Map)->java.lang.StringBuilder.append(java.lang.String) 255 | 256 | 257 | 258 | 259 | 260 | org.nhjclxc.cg.FileUtils.toDot(java.util.Map)->java.lang.StringBuilder.append(java.lang.String) 261 | 262 | 263 | 264 | 265 | 266 | java.util.Map.put(java.lang.Object,java.lang.Object) 267 | 268 | java.util.Map.put(java.lang.Object,java.lang.Object) 269 | 270 | 271 | 272 | org.nhjclxc.cg.FileUtils.toDot(java.util.Map)->java.util.Map.put(java.lang.Object,java.lang.Object) 273 | 274 | 275 | 276 | 277 | 278 | java.lang.String.valueOf(java.lang.Object) 279 | 280 | java.lang.String.valueOf(java.lang.Object) 281 | 282 | 283 | 284 | org.nhjclxc.cg.FileUtils.toDot(java.util.Map)->java.lang.String.valueOf(java.lang.Object) 285 | 286 | 287 | 288 | 289 | 290 | org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)->org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List) 291 | 292 | 293 | 294 | 295 | 296 | org.nhjclxc.cg.SpoonCGNode.getSpoonCGDotList() 297 | 298 | org.nhjclxc.cg.SpoonCGNode.getSpoonCGDotList() 299 | 300 | 301 | 302 | org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)->org.nhjclxc.cg.SpoonCGNode.getSpoonCGDotList() 303 | 304 | 305 | 306 | 307 | 308 | org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)->java.util.List.size() 309 | 310 | 311 | 312 | 313 | 314 | org.nhjclxc.cg.SpoonCGNode.getMethodQualifiedName() 315 | 316 | org.nhjclxc.cg.SpoonCGNode.getMethodQualifiedName() 317 | 318 | 319 | 320 | org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)->org.nhjclxc.cg.SpoonCGNode.getMethodQualifiedName() 321 | 322 | 323 | 324 | 325 | 326 | org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)->org.nhjclxc.cg.SpoonCGNode.getMethodQualifiedName() 327 | 328 | 329 | 330 | 331 | 332 | java.util.List.add(java.lang.Object) 333 | 334 | java.util.List.add(java.lang.Object) 335 | 336 | 337 | 338 | org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)->java.util.List.add(java.lang.Object) 339 | 340 | 341 | 342 | 343 | 344 | org.nhjclxc.cg.FileUtils.writeDotFile(java.lang.String,java.util.Map)->java.util.Map.entrySet() 345 | 346 | 347 | 348 | 349 | 350 | org.nhjclxc.cg.FileUtils.writeDotFile(java.lang.String,java.util.Map)->java.util.Map$Entry.getKey() 351 | 352 | 353 | 354 | 355 | 356 | org.nhjclxc.cg.FileUtils.writeDotFile(java.lang.String,java.util.Map)->org.nhjclxc.cg.FileUtils.toDot(java.util.Map) 357 | 358 | 359 | 360 | 361 | 362 | org.nhjclxc.cg.FileUtils.writeDotFile(java.lang.String,java.util.Map)->java.util.Map$Entry.getValue() 363 | 364 | 365 | 366 | 367 | 368 | org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String) 369 | 370 | org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String) 371 | 372 | 373 | 374 | org.nhjclxc.cg.FileUtils.writeDotFile(java.lang.String,java.util.Map)->org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String) 375 | 376 | 377 | 378 | 379 | 380 | org.nhjclxc.cg.FileUtils.getFilePath(java.lang.String) 381 | 382 | org.nhjclxc.cg.FileUtils.getFilePath(java.lang.String) 383 | 384 | 385 | 386 | org.nhjclxc.cg.FileUtils.writeDotFile(java.lang.String,java.util.Map)->org.nhjclxc.cg.FileUtils.getFilePath(java.lang.String) 387 | 388 | 389 | 390 | 391 | 392 | org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String) 393 | 394 | org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String) 395 | 396 | 397 | 398 | 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) 399 | 400 | 401 | 402 | 403 | 404 | java.io.File(java.lang.String) 405 | 406 | java.io.File(java.lang.String) 407 | 408 | 409 | 410 | org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)->java.io.File(java.lang.String) 411 | 412 | 413 | 414 | 415 | 416 | java.io.File.getParentFile() 417 | 418 | java.io.File.getParentFile() 419 | 420 | 421 | 422 | org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)->java.io.File.getParentFile() 423 | 424 | 425 | 426 | 427 | 428 | java.io.File.exists() 429 | 430 | java.io.File.exists() 431 | 432 | 433 | 434 | org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)->java.io.File.exists() 435 | 436 | 437 | 438 | 439 | 440 | java.io.File.mkdirs() 441 | 442 | java.io.File.mkdirs() 443 | 444 | 445 | 446 | org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)->java.io.File.mkdirs() 447 | 448 | 449 | 450 | 451 | 452 | java.io.FileWriter(java.io.File) 453 | 454 | java.io.FileWriter(java.io.File) 455 | 456 | 457 | 458 | org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)->java.io.FileWriter(java.io.File) 459 | 460 | 461 | 462 | 463 | 464 | java.io.Writer.write(java.lang.String) 465 | 466 | java.io.Writer.write(java.lang.String) 467 | 468 | 469 | 470 | org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)->java.io.Writer.write(java.lang.String) 471 | 472 | 473 | 474 | 475 | 476 | java.io.OutputStreamWriter.flush() 477 | 478 | java.io.OutputStreamWriter.flush() 479 | 480 | 481 | 482 | org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)->java.io.OutputStreamWriter.flush() 483 | 484 | 485 | 486 | 487 | 488 | java.io.OutputStreamWriter.close() 489 | 490 | java.io.OutputStreamWriter.close() 491 | 492 | 493 | 494 | org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)->java.io.OutputStreamWriter.close() 495 | 496 | 497 | 498 | 499 | 500 | java.lang.RuntimeException(java.lang.Throwable) 501 | 502 | java.lang.RuntimeException(java.lang.Throwable) 503 | 504 | 505 | 506 | org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)->java.lang.RuntimeException(java.lang.Throwable) 507 | 508 | 509 | 510 | 511 | 512 | java.util.regex.Pattern.matcher(java.lang.CharSequence) 513 | 514 | java.util.regex.Pattern.matcher(java.lang.CharSequence) 515 | 516 | 517 | 518 | org.nhjclxc.cg.FileUtils.getFilePath(java.lang.String)->java.util.regex.Pattern.matcher(java.lang.CharSequence) 519 | 520 | 521 | 522 | 523 | 524 | java.util.regex.Pattern.compile(java.lang.String) 525 | 526 | java.util.regex.Pattern.compile(java.lang.String) 527 | 528 | 529 | 530 | org.nhjclxc.cg.FileUtils.getFilePath(java.lang.String)->java.util.regex.Pattern.compile(java.lang.String) 531 | 532 | 533 | 534 | 535 | 536 | java.util.regex.Matcher.find() 537 | 538 | java.util.regex.Matcher.find() 539 | 540 | 541 | 542 | org.nhjclxc.cg.FileUtils.getFilePath(java.lang.String)->java.util.regex.Matcher.find() 543 | 544 | 545 | 546 | 547 | 548 | java.util.regex.Matcher.group(int) 549 | 550 | java.util.regex.Matcher.group(int) 551 | 552 | 553 | 554 | org.nhjclxc.cg.FileUtils.getFilePath(java.lang.String)->java.util.regex.Matcher.group(int) 555 | 556 | 557 | 558 | 559 | 560 | java.lang.System.currentTimeMillis() 561 | 562 | java.lang.System.currentTimeMillis() 563 | 564 | 565 | 566 | org.nhjclxc.cg.FileUtils.getFilePath(java.lang.String)->java.lang.System.currentTimeMillis() 567 | 568 | 569 | 570 | 571 | 572 | java.lang.String.replaceAll(java.lang.String,java.lang.String) 573 | 574 | java.lang.String.replaceAll(java.lang.String,java.lang.String) 575 | 576 | 577 | 578 | org.nhjclxc.cg.FileUtils.getFilePath(java.lang.String)->java.lang.String.replaceAll(java.lang.String,java.lang.String) 579 | 580 | 581 | 582 | 583 | 584 | org.nhjclxc.graphviz.GraphvizAssistant.getFilePathPerfix(java.lang.String) 585 | 586 | org.nhjclxc.graphviz.GraphvizAssistant.getFilePathPerfix(java.lang.String) 587 | 588 | 589 | 590 | java.lang.String.lastIndexOf(java.lang.String) 591 | 592 | java.lang.String.lastIndexOf(java.lang.String) 593 | 594 | 595 | 596 | org.nhjclxc.graphviz.GraphvizAssistant.getFilePathPerfix(java.lang.String)->java.lang.String.lastIndexOf(java.lang.String) 597 | 598 | 599 | 600 | 601 | 602 | java.lang.String.substring(int,int) 603 | 604 | java.lang.String.substring(int,int) 605 | 606 | 607 | 608 | org.nhjclxc.graphviz.GraphvizAssistant.getFilePathPerfix(java.lang.String)->java.lang.String.substring(int,int) 609 | 610 | 611 | 612 | 613 | 614 | org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)->java.io.File(java.lang.String) 615 | 616 | 617 | 618 | 619 | 620 | org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)->org.nhjclxc.graphviz.GraphvizAssistant.getFilePathPerfix(java.lang.String) 621 | 622 | 623 | 624 | 625 | 626 | java.io.File.getAbsolutePath() 627 | 628 | java.io.File.getAbsolutePath() 629 | 630 | 631 | 632 | org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)->java.io.File.getAbsolutePath() 633 | 634 | 635 | 636 | 637 | 638 | org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)->java.io.File.getAbsolutePath() 639 | 640 | 641 | 642 | 643 | 644 | org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)->java.io.File.getAbsolutePath() 645 | 646 | 647 | 648 | 649 | 650 | java.lang.Runtime.getRuntime() 651 | 652 | java.lang.Runtime.getRuntime() 653 | 654 | 655 | 656 | org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)->java.lang.Runtime.getRuntime() 657 | 658 | 659 | 660 | 661 | 662 | java.lang.Runtime.exec(java.lang.String[]) 663 | 664 | java.lang.Runtime.exec(java.lang.String[]) 665 | 666 | 667 | 668 | org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)->java.lang.Runtime.exec(java.lang.String[]) 669 | 670 | 671 | 672 | 673 | 674 | java.lang.Process.waitFor() 675 | 676 | java.lang.Process.waitFor() 677 | 678 | 679 | 680 | org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)->java.lang.Process.waitFor() 681 | 682 | 683 | 684 | 685 | 686 | java.lang.Throwable.printStackTrace() 687 | 688 | java.lang.Throwable.printStackTrace() 689 | 690 | 691 | 692 | org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)->java.lang.Throwable.printStackTrace() 693 | 694 | 695 | 696 | 697 | -------------------------------------------------------------------------------- /output/org/nhjclxc/cg/SpoonCGProcessor/main.dot: -------------------------------------------------------------------------------- 1 | digraph "org.nhjclxc.cg.SpoonCGProcessor.main(java.lang.String[])" { 2 | "org.nhjclxc.cg.SpoonCGProcessor.main(java.lang.String[])" -> "org.nhjclxc.cg.SpoonCGProcessor()"; 3 | 4 | "org.nhjclxc.cg.SpoonCGProcessor.build(java.lang.String)" -> "spoon.Launcher()"; 5 | 6 | "org.nhjclxc.cg.SpoonCGProcessor.build(java.lang.String)" -> "spoon.Launcher.addInputResource(java.lang.String)"; 7 | 8 | "org.nhjclxc.cg.SpoonCGProcessor.build(java.lang.String)" -> "spoon.Launcher.addProcessor(spoon.processing.Processor)"; 9 | 10 | "org.nhjclxc.cg.SpoonCGProcessor.build(java.lang.String)" -> "spoon.Launcher.run()"; 11 | 12 | "org.nhjclxc.cg.SpoonCGVisitor.getSpoonCGNodeMap()" -> "java.util.Collection.removeIf(java.util.function.Predicate)"; 13 | 14 | "org.nhjclxc.cg.SpoonCGVisitor.getSpoonCGNodeMap()" -> "java.util.Map.entrySet()"; 15 | 16 | "org.nhjclxc.cg.SpoonCGVisitor.getSpoonCGNodeMap()" -> "java.util.Set.contains(java.lang.Object)"; 17 | 18 | "org.nhjclxc.cg.SpoonCGVisitor.getSpoonCGNodeMap()" -> "java.util.Map$Entry.getKey()"; 19 | 20 | "org.nhjclxc.cg.SpoonCGProcessor.build(java.lang.String)" -> "org.nhjclxc.cg.SpoonCGVisitor.getSpoonCGNodeMap()"; 21 | 22 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.util.HashMap()"; 23 | 24 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.util.Map.entrySet()"; 25 | 26 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.util.Map$Entry.getKey()"; 27 | 28 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.util.Map$Entry.getValue()"; 29 | 30 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.lang.StringBuilder(java.lang.String)"; 31 | 32 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.util.LinkedList()"; 33 | 34 | "org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)" -> "org.nhjclxc.cg.SpoonCGNode.getSpoonCGDotList()"; 35 | 36 | "org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)" -> "java.util.List.size()"; 37 | 38 | "org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)" -> "org.nhjclxc.cg.SpoonCGNode.getMethodQualifiedName()"; 39 | 40 | "org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)" -> "org.nhjclxc.cg.SpoonCGNode.getMethodQualifiedName()"; 41 | 42 | "org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)" -> "org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)"; 43 | 44 | "org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)" -> "java.util.List.add(java.lang.Object)"; 45 | 46 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "org.nhjclxc.cg.FileUtils.buildEdges(org.nhjclxc.cg.SpoonCGNode,java.util.List)"; 47 | 48 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.util.List.size()"; 49 | 50 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.lang.StringBuilder.append(java.lang.String)"; 51 | 52 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.lang.StringBuilder.append(java.lang.String)"; 53 | 54 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.util.Map.put(java.lang.Object,java.lang.Object)"; 55 | 56 | "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)" -> "java.lang.String.valueOf(java.lang.Object)"; 57 | 58 | "org.nhjclxc.cg.FileUtils.writeDotFile(java.lang.String,java.util.Map)" -> "org.nhjclxc.cg.FileUtils.toDot(java.util.Map)"; 59 | 60 | "org.nhjclxc.cg.FileUtils.writeDotFile(java.lang.String,java.util.Map)" -> "java.util.Map.entrySet()"; 61 | 62 | "org.nhjclxc.cg.FileUtils.writeDotFile(java.lang.String,java.util.Map)" -> "java.util.Map$Entry.getKey()"; 63 | 64 | "org.nhjclxc.cg.FileUtils.writeDotFile(java.lang.String,java.util.Map)" -> "java.util.Map$Entry.getValue()"; 65 | 66 | "org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)" -> "java.io.File(java.lang.String)"; 67 | 68 | "org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)" -> "java.io.File.getParentFile()"; 69 | 70 | "org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)" -> "java.io.File.exists()"; 71 | 72 | "org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)" -> "java.io.File.mkdirs()"; 73 | 74 | "org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)" -> "java.io.FileWriter(java.io.File)"; 75 | 76 | "org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)" -> "java.io.Writer.write(java.lang.String)"; 77 | 78 | "org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)" -> "java.io.OutputStreamWriter.flush()"; 79 | 80 | "org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)" -> "java.io.OutputStreamWriter.close()"; 81 | 82 | "org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)" -> "java.lang.RuntimeException(java.lang.Throwable)"; 83 | 84 | "org.nhjclxc.cg.FileUtils.writeDotFile(java.lang.String,java.util.Map)" -> "org.nhjclxc.cg.FileUtils.write(java.lang.String,java.lang.String)"; 85 | 86 | "org.nhjclxc.cg.FileUtils.getFilePath(java.lang.String)" -> "java.util.regex.Pattern.matcher(java.lang.CharSequence)"; 87 | 88 | "org.nhjclxc.cg.FileUtils.getFilePath(java.lang.String)" -> "java.util.regex.Pattern.compile(java.lang.String)"; 89 | 90 | "org.nhjclxc.cg.FileUtils.getFilePath(java.lang.String)" -> "java.util.regex.Matcher.find()"; 91 | 92 | "org.nhjclxc.cg.FileUtils.getFilePath(java.lang.String)" -> "java.util.regex.Matcher.group(int)"; 93 | 94 | "org.nhjclxc.cg.FileUtils.getFilePath(java.lang.String)" -> "java.lang.System.currentTimeMillis()"; 95 | 96 | "org.nhjclxc.cg.FileUtils.getFilePath(java.lang.String)" -> "java.lang.String.replaceAll(java.lang.String,java.lang.String)"; 97 | 98 | "org.nhjclxc.cg.FileUtils.writeDotFile(java.lang.String,java.util.Map)" -> "org.nhjclxc.cg.FileUtils.getFilePath(java.lang.String)"; 99 | 100 | "org.nhjclxc.graphviz.GraphvizAssistant.getFilePathPerfix(java.lang.String)" -> "java.lang.String.lastIndexOf(java.lang.String)"; 101 | 102 | "org.nhjclxc.graphviz.GraphvizAssistant.getFilePathPerfix(java.lang.String)" -> "java.lang.String.substring(int,int)"; 103 | 104 | "org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)" -> "org.nhjclxc.graphviz.GraphvizAssistant.getFilePathPerfix(java.lang.String)"; 105 | 106 | "org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)" -> "java.io.File.getAbsolutePath()"; 107 | 108 | "org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)" -> "java.io.File(java.lang.String)"; 109 | 110 | "org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)" -> "java.lang.Runtime.getRuntime()"; 111 | 112 | "org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)" -> "java.io.File.getAbsolutePath()"; 113 | 114 | "org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)" -> "java.io.File.getAbsolutePath()"; 115 | 116 | "org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)" -> "java.lang.Runtime.exec(java.lang.String[])"; 117 | 118 | "org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)" -> "java.lang.Process.waitFor()"; 119 | 120 | "org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)" -> "java.lang.Throwable.printStackTrace()"; 121 | 122 | "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)"; 123 | 124 | "org.nhjclxc.cg.SpoonCGProcessor.build(java.lang.String)" -> "org.nhjclxc.cg.FileUtils.writeDotFile(java.lang.String,java.util.Map)"; 125 | 126 | "org.nhjclxc.cg.SpoonCGProcessor.build(java.lang.String)" -> "java.io.PrintStream.println(java.lang.String)"; 127 | 128 | "org.nhjclxc.cg.SpoonCGProcessor.build(java.lang.String)" -> "java.io.PrintStream.println(java.lang.String)"; 129 | 130 | "org.nhjclxc.cg.SpoonCGProcessor.build(java.lang.String)" -> "java.io.PrintStream.println(java.lang.String)"; 131 | 132 | "org.nhjclxc.cg.SpoonCGProcessor.main(java.lang.String[])" -> "org.nhjclxc.cg.SpoonCGProcessor.build(java.lang.String)"; 133 | 134 | } -------------------------------------------------------------------------------- /output/org/nhjclxc/cg/SpoonCGProcessor/main.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhjclxc/java-callgraph-spoon/8c7727b616fb50e905ce33073ee9b6611baa6a76/output/org/nhjclxc/cg/SpoonCGProcessor/main.png -------------------------------------------------------------------------------- /output/org/nhjclxc/cg/SpoonCGProcessor/process.dot: -------------------------------------------------------------------------------- 1 | digraph "org.nhjclxc.cg.SpoonCGProcessor.process(spoon.reflect.declaration.CtMethod)" { 2 | "org.nhjclxc.cg.SpoonCGProcessor.process(spoon.reflect.declaration.CtMethod)" -> "spoon.reflect.visitor.CtVisitable.accept(spoon.reflect.visitor.CtVisitor)"; 3 | 4 | } -------------------------------------------------------------------------------- /output/org/nhjclxc/cg/SpoonCGProcessor/process.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhjclxc/java-callgraph-spoon/8c7727b616fb50e905ce33073ee9b6611baa6a76/output/org/nhjclxc/cg/SpoonCGProcessor/process.png -------------------------------------------------------------------------------- /output/org/nhjclxc/cg/SpoonCGVisitor/getMethodModifier.dot: -------------------------------------------------------------------------------- 1 | digraph "org.nhjclxc.cg.SpoonCGVisitor.getMethodModifier(java.util.Set)" { 2 | "org.nhjclxc.cg.SpoonCGVisitor.getMethodModifier(java.util.Set)" -> "java.util.Set.contains(java.lang.Object)"; 3 | 4 | "org.nhjclxc.cg.SpoonCGVisitor.getMethodModifier(java.util.Set)" -> "java.util.Set.contains(java.lang.Object)"; 5 | 6 | "org.nhjclxc.cg.SpoonCGVisitor.getMethodModifier(java.util.Set)" -> "java.util.Set.contains(java.lang.Object)"; 7 | 8 | "org.nhjclxc.cg.SpoonCGVisitor.getMethodModifier(java.util.Set)" -> "java.util.Set.contains(java.lang.Object)"; 9 | 10 | "org.nhjclxc.cg.SpoonCGVisitor.getMethodModifier(java.util.Set)" -> "java.util.Set.contains(java.lang.Object)"; 11 | 12 | "org.nhjclxc.cg.SpoonCGVisitor.getMethodModifier(java.util.Set)" -> "java.util.Set.contains(java.lang.Object)"; 13 | 14 | "org.nhjclxc.cg.SpoonCGVisitor.getMethodModifier(java.util.Set)" -> "java.util.Set.contains(java.lang.Object)"; 15 | 16 | "org.nhjclxc.cg.SpoonCGVisitor.getMethodModifier(java.util.Set)" -> "java.util.Set.contains(java.lang.Object)"; 17 | 18 | "org.nhjclxc.cg.SpoonCGVisitor.getMethodModifier(java.util.Set)" -> "java.util.Set.contains(java.lang.Object)"; 19 | 20 | "org.nhjclxc.cg.SpoonCGVisitor.getMethodModifier(java.util.Set)" -> "java.util.Set.contains(java.lang.Object)"; 21 | 22 | "org.nhjclxc.cg.SpoonCGVisitor.getMethodModifier(java.util.Set)" -> "java.util.Set.contains(java.lang.Object)"; 23 | 24 | } -------------------------------------------------------------------------------- /output/org/nhjclxc/cg/SpoonCGVisitor/getMethodModifier.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhjclxc/java-callgraph-spoon/8c7727b616fb50e905ce33073ee9b6611baa6a76/output/org/nhjclxc/cg/SpoonCGVisitor/getMethodModifier.png -------------------------------------------------------------------------------- /output/org/nhjclxc/cg/SpoonCGVisitor/getMethodQualifiedName.dot: -------------------------------------------------------------------------------- 1 | digraph "org.nhjclxc.cg.SpoonCGVisitor.getMethodQualifiedName(spoon.reflect.declaration.CtMethod)" { 2 | "org.nhjclxc.cg.SpoonCGVisitor.getMethodQualifiedName(spoon.reflect.declaration.CtMethod)" -> "spoon.reflect.declaration.CtTypeMember.getDeclaringType()"; 3 | 4 | "org.nhjclxc.cg.SpoonCGVisitor.getMethodQualifiedName(spoon.reflect.declaration.CtMethod)" -> "spoon.reflect.declaration.CtPackage.getQualifiedName()"; 5 | 6 | "org.nhjclxc.cg.SpoonCGVisitor.getMethodQualifiedName(spoon.reflect.declaration.CtMethod)" -> "spoon.reflect.declaration.CtType.getPackage()"; 7 | 8 | "org.nhjclxc.cg.SpoonCGVisitor.getMethodQualifiedName(spoon.reflect.declaration.CtMethod)" -> "spoon.reflect.declaration.CtType.getSimpleName()"; 9 | 10 | "org.nhjclxc.cg.SpoonCGVisitor.getMethodQualifiedName(spoon.reflect.declaration.CtMethod)" -> "spoon.reflect.declaration.CtExecutable.getSignature()"; 11 | 12 | "org.nhjclxc.cg.SpoonCGVisitor.getMethodQualifiedName(spoon.reflect.declaration.CtMethod)" -> "spoon.reflect.declaration.CtTypeInformation.getQualifiedName()"; 13 | 14 | "org.nhjclxc.cg.SpoonCGVisitor.getMethodQualifiedName(spoon.reflect.declaration.CtMethod)" -> "spoon.reflect.declaration.CtTypedElement.getType()"; 15 | 16 | } -------------------------------------------------------------------------------- /output/org/nhjclxc/cg/SpoonCGVisitor/getMethodQualifiedName.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhjclxc/java-callgraph-spoon/8c7727b616fb50e905ce33073ee9b6611baa6a76/output/org/nhjclxc/cg/SpoonCGVisitor/getMethodQualifiedName.png -------------------------------------------------------------------------------- /output/org/nhjclxc/cg/SpoonCGVisitor/getSpoonCGNode.dot: -------------------------------------------------------------------------------- 1 | digraph "org.nhjclxc.cg.SpoonCGVisitor.getSpoonCGNode(java.lang.String)" { 2 | "org.nhjclxc.cg.SpoonCGVisitor.getSpoonCGNode(java.lang.String)" -> "java.util.Map.get(java.lang.Object)"; 3 | 4 | "org.nhjclxc.cg.SpoonCGVisitor.getSpoonCGNode(java.lang.String)" -> "org.nhjclxc.cg.SpoonCGNode(java.lang.String)"; 5 | 6 | "org.nhjclxc.cg.SpoonCGVisitor.getSpoonCGNode(java.lang.String)" -> "java.util.Map.put(java.lang.Object,java.lang.Object)"; 7 | 8 | } -------------------------------------------------------------------------------- /output/org/nhjclxc/cg/SpoonCGVisitor/getSpoonCGNode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhjclxc/java-callgraph-spoon/8c7727b616fb50e905ce33073ee9b6611baa6a76/output/org/nhjclxc/cg/SpoonCGVisitor/getSpoonCGNode.png -------------------------------------------------------------------------------- /output/org/nhjclxc/cg/SpoonCGVisitor/getSpoonCGNodeMap.dot: -------------------------------------------------------------------------------- 1 | digraph "org.nhjclxc.cg.SpoonCGVisitor.getSpoonCGNodeMap()" { 2 | "org.nhjclxc.cg.SpoonCGVisitor.getSpoonCGNodeMap()" -> "java.util.Collection.removeIf(java.util.function.Predicate)"; 3 | 4 | "org.nhjclxc.cg.SpoonCGVisitor.getSpoonCGNodeMap()" -> "java.util.Map.entrySet()"; 5 | 6 | "org.nhjclxc.cg.SpoonCGVisitor.getSpoonCGNodeMap()" -> "java.util.Set.contains(java.lang.Object)"; 7 | 8 | "org.nhjclxc.cg.SpoonCGVisitor.getSpoonCGNodeMap()" -> "java.util.Map$Entry.getKey()"; 9 | 10 | } -------------------------------------------------------------------------------- /output/org/nhjclxc/cg/SpoonCGVisitor/getSpoonCGNodeMap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhjclxc/java-callgraph-spoon/8c7727b616fb50e905ce33073ee9b6611baa6a76/output/org/nhjclxc/cg/SpoonCGVisitor/getSpoonCGNodeMap.png -------------------------------------------------------------------------------- /output/org/nhjclxc/cg/SpoonCGVisitor/visitCtMethod.dot: -------------------------------------------------------------------------------- 1 | digraph "org.nhjclxc.cg.SpoonCGVisitor.visitCtMethod(spoon.reflect.declaration.CtMethod)" { 2 | "org.nhjclxc.cg.SpoonCGVisitor.visitCtMethod(spoon.reflect.declaration.CtMethod)" -> "java.util.Set.contains(java.lang.Object)"; 3 | 4 | "org.nhjclxc.cg.SpoonCGVisitor.visitCtMethod(spoon.reflect.declaration.CtMethod)" -> "spoon.reflect.declaration.CtModifiable.getModifiers()"; 5 | 6 | "org.nhjclxc.cg.SpoonCGVisitor.getMethodQualifiedName(spoon.reflect.declaration.CtMethod)" -> "spoon.reflect.declaration.CtTypeMember.getDeclaringType()"; 7 | 8 | "org.nhjclxc.cg.SpoonCGVisitor.getMethodQualifiedName(spoon.reflect.declaration.CtMethod)" -> "spoon.reflect.declaration.CtPackage.getQualifiedName()"; 9 | 10 | "org.nhjclxc.cg.SpoonCGVisitor.getMethodQualifiedName(spoon.reflect.declaration.CtMethod)" -> "spoon.reflect.declaration.CtType.getPackage()"; 11 | 12 | "org.nhjclxc.cg.SpoonCGVisitor.getMethodQualifiedName(spoon.reflect.declaration.CtMethod)" -> "spoon.reflect.declaration.CtType.getSimpleName()"; 13 | 14 | "org.nhjclxc.cg.SpoonCGVisitor.getMethodQualifiedName(spoon.reflect.declaration.CtMethod)" -> "spoon.reflect.declaration.CtExecutable.getSignature()"; 15 | 16 | "org.nhjclxc.cg.SpoonCGVisitor.getMethodQualifiedName(spoon.reflect.declaration.CtMethod)" -> "spoon.reflect.declaration.CtTypeInformation.getQualifiedName()"; 17 | 18 | "org.nhjclxc.cg.SpoonCGVisitor.getMethodQualifiedName(spoon.reflect.declaration.CtMethod)" -> "spoon.reflect.declaration.CtTypedElement.getType()"; 19 | 20 | "org.nhjclxc.cg.SpoonCGVisitor.visitCtMethod(spoon.reflect.declaration.CtMethod)" -> "org.nhjclxc.cg.SpoonCGVisitor.getMethodQualifiedName(spoon.reflect.declaration.CtMethod)"; 21 | 22 | "org.nhjclxc.cg.SpoonCGVisitor.visitCtMethod(spoon.reflect.declaration.CtMethod)" -> "java.util.Set.contains(java.lang.Object)"; 23 | 24 | "org.nhjclxc.cg.SpoonCGVisitor.visitCtMethod(spoon.reflect.declaration.CtMethod)" -> "java.util.Set.add(java.lang.Object)"; 25 | 26 | "org.nhjclxc.cg.SpoonCGVisitor.getSpoonCGNode(java.lang.String)" -> "java.util.Map.get(java.lang.Object)"; 27 | 28 | "org.nhjclxc.cg.SpoonCGVisitor.getSpoonCGNode(java.lang.String)" -> "org.nhjclxc.cg.SpoonCGNode(java.lang.String)"; 29 | 30 | "org.nhjclxc.cg.SpoonCGVisitor.getSpoonCGNode(java.lang.String)" -> "java.util.Map.put(java.lang.Object,java.lang.Object)"; 31 | 32 | "org.nhjclxc.cg.SpoonCGVisitor.visitCtMethod(spoon.reflect.declaration.CtMethod)" -> "org.nhjclxc.cg.SpoonCGVisitor.getSpoonCGNode(java.lang.String)"; 33 | 34 | "org.nhjclxc.cg.SpoonCGVisitor.visitCtMethod(spoon.reflect.declaration.CtMethod)" -> "org.nhjclxc.cg.SpoonCGNode.getSpoonCGDotList()"; 35 | 36 | "org.nhjclxc.cg.SpoonCGVisitor.visitCtMethod(spoon.reflect.declaration.CtMethod)" -> "spoon.reflect.declaration.CtElement.getElements(spoon.reflect.visitor.Filter)"; 37 | 38 | "org.nhjclxc.cg.SpoonCGVisitor.visitCtMethod(spoon.reflect.declaration.CtMethod)" -> "spoon.reflect.declaration.CtExecutable.getBody()"; 39 | 40 | "org.nhjclxc.cg.SpoonCGVisitor.visitCtMethod(spoon.reflect.declaration.CtMethod)" -> "java.io.PrintStream.println(java.lang.String)"; 41 | 42 | "org.nhjclxc.cg.SpoonCGVisitor.visitCtMethod(spoon.reflect.declaration.CtMethod)" -> "spoon.reflect.code.CtAbstractInvocation.getExecutable()"; 43 | 44 | "org.nhjclxc.cg.SpoonCGVisitor.visitCtMethod(spoon.reflect.declaration.CtMethod)" -> "spoon.reflect.declaration.CtTypeInformation.getQualifiedName()"; 45 | 46 | "org.nhjclxc.cg.SpoonCGVisitor.visitCtMethod(spoon.reflect.declaration.CtMethod)" -> "spoon.reflect.reference.CtExecutableReference.getDeclaringType()"; 47 | 48 | "org.nhjclxc.cg.SpoonCGVisitor.visitCtMethod(spoon.reflect.declaration.CtMethod)" -> "java.lang.Object.toString()"; 49 | 50 | "org.nhjclxc.cg.SpoonCGVisitor.visitCtMethod(spoon.reflect.declaration.CtMethod)" -> "spoon.reflect.reference.CtExecutableReference.getType()"; 51 | 52 | "org.nhjclxc.cg.SpoonCGVisitor.visitCtMethod(spoon.reflect.declaration.CtMethod)" -> "java.io.PrintStream.println(java.lang.String)"; 53 | 54 | "org.nhjclxc.cg.SpoonCGVisitor.visitCtMethod(spoon.reflect.declaration.CtMethod)" -> "spoon.reflect.code.CtAbstractInvocation.getExecutable()"; 55 | 56 | "org.nhjclxc.cg.SpoonCGVisitor.visitCtMethod(spoon.reflect.declaration.CtMethod)" -> "java.lang.Object.toString()"; 57 | 58 | "org.nhjclxc.cg.SpoonCGVisitor.visitCtMethod(spoon.reflect.declaration.CtMethod)" -> "java.io.PrintStream.println(java.lang.String)"; 59 | 60 | "org.nhjclxc.cg.SpoonCGVisitor.getSpoonCGNode(java.lang.String)" -> "java.util.Map.get(java.lang.Object)"; 61 | 62 | "org.nhjclxc.cg.SpoonCGVisitor.getSpoonCGNode(java.lang.String)" -> "org.nhjclxc.cg.SpoonCGNode(java.lang.String)"; 63 | 64 | "org.nhjclxc.cg.SpoonCGVisitor.getSpoonCGNode(java.lang.String)" -> "java.util.Map.put(java.lang.Object,java.lang.Object)"; 65 | 66 | "org.nhjclxc.cg.SpoonCGVisitor.visitCtMethod(spoon.reflect.declaration.CtMethod)" -> "org.nhjclxc.cg.SpoonCGVisitor.getSpoonCGNode(java.lang.String)"; 67 | 68 | "org.nhjclxc.cg.SpoonCGVisitor.visitCtMethod(spoon.reflect.declaration.CtMethod)" -> "java.util.List.add(java.lang.Object)"; 69 | 70 | } -------------------------------------------------------------------------------- /output/org/nhjclxc/cg/SpoonCGVisitor/visitCtMethod.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhjclxc/java-callgraph-spoon/8c7727b616fb50e905ce33073ee9b6611baa6a76/output/org/nhjclxc/cg/SpoonCGVisitor/visitCtMethod.png -------------------------------------------------------------------------------- /output/org/nhjclxc/graphviz/GraphvizAssistant/createImage.dot: -------------------------------------------------------------------------------- 1 | digraph "org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)" { 2 | "org.nhjclxc.graphviz.GraphvizAssistant.getFilePathPerfix(java.lang.String)" -> "java.lang.String.lastIndexOf(java.lang.String)"; 3 | 4 | "org.nhjclxc.graphviz.GraphvizAssistant.getFilePathPerfix(java.lang.String)" -> "java.lang.String.substring(int,int)"; 5 | 6 | "org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)" -> "org.nhjclxc.graphviz.GraphvizAssistant.getFilePathPerfix(java.lang.String)"; 7 | 8 | "org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)" -> "java.io.File.getAbsolutePath()"; 9 | 10 | "org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)" -> "java.io.File(java.lang.String)"; 11 | 12 | "org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)" -> "java.lang.Runtime.getRuntime()"; 13 | 14 | "org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)" -> "java.io.File.getAbsolutePath()"; 15 | 16 | "org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)" -> "java.io.File.getAbsolutePath()"; 17 | 18 | "org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)" -> "java.lang.Runtime.exec(java.lang.String[])"; 19 | 20 | "org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)" -> "java.lang.Process.waitFor()"; 21 | 22 | "org.nhjclxc.graphviz.GraphvizAssistant.createImage(java.io.File,java.lang.String,java.lang.String)" -> "java.lang.Throwable.printStackTrace()"; 23 | 24 | } -------------------------------------------------------------------------------- /output/org/nhjclxc/graphviz/GraphvizAssistant/createImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhjclxc/java-callgraph-spoon/8c7727b616fb50e905ce33073ee9b6611baa6a76/output/org/nhjclxc/graphviz/GraphvizAssistant/createImage.png -------------------------------------------------------------------------------- /output/org/nhjclxc/graphviz/GraphvizAssistant/getFilePathPerfix.dot: -------------------------------------------------------------------------------- 1 | digraph "org.nhjclxc.graphviz.GraphvizAssistant.getFilePathPerfix(java.lang.String)" { 2 | "org.nhjclxc.graphviz.GraphvizAssistant.getFilePathPerfix(java.lang.String)" -> "java.lang.String.lastIndexOf(java.lang.String)"; 3 | 4 | "org.nhjclxc.graphviz.GraphvizAssistant.getFilePathPerfix(java.lang.String)" -> "java.lang.String.substring(int,int)"; 5 | 6 | } -------------------------------------------------------------------------------- /output/org/nhjclxc/graphviz/GraphvizAssistant/getFilePathPerfix.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhjclxc/java-callgraph-spoon/8c7727b616fb50e905ce33073ee9b6611baa6a76/output/org/nhjclxc/graphviz/GraphvizAssistant/getFilePathPerfix.png -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | org.nhjclxc 8 | java-callgraph-spoon 9 | 1.0-SNAPSHOT 10 | 11 | 12 | 8 13 | 8 14 | UTF-8 15 | 16 | 17 | 18 | 19 | fr.inria.gforge.spoon 20 | spoon-core 21 | 22 | 7.3.0 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | org.apache.maven.plugins 32 | maven-assembly-plugin 33 | 3.0.0 34 | 35 | 36 | jar-with-dependencies 37 | 38 | 39 | 40 | true 41 | lib/ 42 | org.nhjclxc.Main 43 | 44 | 45 | 46 | 47 | 48 | make-assembly 49 | package 50 | 51 | single 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 | org.apache.maven.plugins 77 | maven-compiler-plugin 78 | 3.8.1 79 | 80 | false 81 | 1.8 82 | 1.8 83 | 84 | 85 | 86 | 87 | 88 | 89 | -------------------------------------------------------------------------------- /src/main/java/org/nhjclxc/Main.java: -------------------------------------------------------------------------------- 1 | package org.nhjclxc; 2 | 3 | import org.nhjclxc.cg.SpoonCGProcessor; 4 | 5 | public class Main { 6 | public static void main(String[] args) { 7 | // System.out.println("Hello world!"); 8 | args = new String[]{"E:\\nbu\\other\\java-callgraph-spoon\\src\\main\\java\\org\\nhjclxc\\cg"}; 9 | if (!(args.length > 0)){ 10 | System.out.println("jar形式启动项目命令格式:java -jar java-callgraph-spoon-1.0-SNAPSHOT.jar file"); 11 | System.out.println("file是单个*.java文件或是多个*.java文件列表,也可以是路径"); 12 | System.out.println("example:"); 13 | System.out.println("java -jar java-callgraph-spoon-1.0-SNAPSHOT.jar test.java"); 14 | System.out.println("java -jar java-callgraph-spoon-1.0-SNAPSHOT.jar test.java test2.java test3.java"); 15 | System.out.println("java -jar java-callgraph-spoon-1.0-SNAPSHOT.jar src\\main\\java\\org\\nhjclxc\\cg"); 16 | } 17 | 18 | SpoonCGProcessor spoonCGProcessor = new SpoonCGProcessor(); 19 | System.out.println("Parameter:"); 20 | for (String arg : args) { 21 | System.out.println(arg); 22 | spoonCGProcessor.build(arg); 23 | } 24 | 25 | 26 | } 27 | } -------------------------------------------------------------------------------- /src/main/java/org/nhjclxc/cg/CGTestFile.java: -------------------------------------------------------------------------------- 1 | package org.nhjclxc.cg; 2 | 3 | 4 | import java.util.LinkedList; 5 | import java.util.List; 6 | 7 | public abstract class CGTestFile { 8 | public static void main(String[] args) { 9 | 10 | } 11 | 12 | private static void getString1(Integer i, ReturnTestClass returnTestClass) { 13 | System.out.println("then"); 14 | get(null, null, null); 15 | } 16 | 17 | public static ReturnTestClass get(String s, Integer i, ReturnTestClass returnTestClass) { 18 | System.out.println("try"); 19 | List list = new LinkedList<>(); 20 | return returnTestClass; 21 | } 22 | // 23 | // public static final boolean isBool(String s, Integer i) { 24 | // return true; 25 | // } 26 | // 27 | // public static synchronized boolean isBool22(String s, Integer i) { 28 | // 29 | // throw new RuntimeException("RuntimeException"); 30 | //// return true; 31 | // } 32 | // 33 | public abstract boolean isBool22ss(String s, Integer i); 34 | } 35 | 36 | class ReturnTestClass { 37 | 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/org/nhjclxc/cg/FileUtils.java: -------------------------------------------------------------------------------- 1 | package org.nhjclxc.cg; 2 | 3 | import org.nhjclxc.graphviz.GraphvizAssistant; 4 | 5 | import java.io.*; 6 | import java.util.HashMap; 7 | import java.util.LinkedList; 8 | import java.util.List; 9 | import java.util.Map; 10 | import java.util.regex.Matcher; 11 | import java.util.regex.Pattern; 12 | 13 | /** 14 | * 文件助手 15 | * 16 | * @author 罗贤超 17 | * @since 2023/10/30 16:34 18 | */ 19 | public class FileUtils { 20 | 21 | 22 | public static void writeDotFile(String outputPath, Map spoonCGNodeMap) { 23 | Map methodInvocationDotGraph = toDot(spoonCGNodeMap); 24 | for (Map.Entry entry : methodInvocationDotGraph.entrySet()) { 25 | String method = entry.getKey(); 26 | String dot = entry.getValue(); 27 | // System.out.println(dot); 28 | File dotFile = write(outputPath + "\\" + getFilePath(method) + ".dot", dot); 29 | // 没有安装Graphviz的话不要打开下面这一句。 30 | // 安装了Graphviz,可以打开下面这一句,会生成dot语言对应的图片 31 | GraphvizAssistant.createImage(dotFile, "png", "dot"); 32 | } 33 | 34 | } 35 | 36 | private static String getFilePath(String methodQualifiedName) { 37 | // 使用正则表达式匹配第一个圆括号及其之前的所有数据 38 | Matcher matcher = Pattern.compile("^(.*?)\\(").matcher(methodQualifiedName); 39 | String path = matcher.find() ? matcher.group(1) : System.currentTimeMillis() + ""; 40 | return path.replaceAll("\\.", "\\\\"); 41 | } 42 | 43 | public static File write(String filename, String data) { 44 | 45 | File file = null; 46 | try { 47 | file = new File(filename); 48 | // 创建目录(如果不存在) 49 | File directory = file.getParentFile(); 50 | if (!directory.exists()) { 51 | boolean mkdirs = directory.mkdirs(); 52 | } 53 | FileWriter fileWriter = new FileWriter(file); 54 | fileWriter.write(data); 55 | fileWriter.flush(); 56 | fileWriter.close(); 57 | } catch (IOException e) { 58 | throw new RuntimeException(e); 59 | } 60 | return file; 61 | } 62 | 63 | /** 64 | * 返回当前扫描到的类里面的所有方法调用dot格式图结构

65 | * 66 | * dot语言介绍

67 | * 在线dot格式图可视化

68 | * Drawing graphs with dot

69 | * 70 | * @param spoonCGNodeMap 调用关系元素数据 71 | * @return 每个方法的dot调用关系 72 | * @author 罗贤超 73 | */ 74 | public static Map toDot(Map spoonCGNodeMap) { 75 | Map graph = new HashMap<>(); 76 | 77 | for (Map.Entry entry : spoonCGNodeMap.entrySet()) { 78 | String key = entry.getKey(); 79 | SpoonCGNode root = entry.getValue(); 80 | StringBuilder dot = new StringBuilder("digraph \"" + key + "\" {\n"); 81 | List edgeList = new LinkedList<>(); 82 | buildEdges(root, edgeList); 83 | if (edgeList.size() > 0) { 84 | for (String s : edgeList) { 85 | dot.append(s); 86 | } 87 | } 88 | dot.append("}"); 89 | graph.put(key, String.valueOf(dot)); 90 | } 91 | return graph; 92 | } 93 | 94 | /** 95 | * 构造从当前节点到终点的所有可能路径 96 | * 97 | * @param spoonCGNode 当前节点 98 | * @param edgeList 边集合 99 | * @author 罗贤超 100 | */ 101 | private static void buildEdges(SpoonCGNode spoonCGNode, List edgeList) { 102 | List spoonCGDotList = spoonCGNode.getSpoonCGDotList(); 103 | if (spoonCGDotList != null && spoonCGDotList.size() > 0) { 104 | String key = spoonCGNode.getMethodQualifiedName(); 105 | for (SpoonCGNode cgNode : spoonCGDotList) { 106 | String edge = "\"" + key + "\" -> \"" + cgNode.getMethodQualifiedName(); 107 | if (spoonCGNode != cgNode) { // 防止递归调用的函数出现栈溢出 108 | buildEdges(cgNode, edgeList); 109 | } 110 | edge += "\";\n\n"; 111 | edgeList.add(edge); 112 | } 113 | } 114 | } 115 | 116 | } 117 | -------------------------------------------------------------------------------- /src/main/java/org/nhjclxc/cg/SpoonCGNode.java: -------------------------------------------------------------------------------- 1 | package org.nhjclxc.cg; 2 | 3 | import java.util.LinkedList; 4 | import java.util.List; 5 | 6 | /** 7 | * 8 | * 调用图节点 9 | * 10 | * @author 罗贤超 11 | * @since 2023/10/30 14:34 12 | */ 13 | public class SpoonCGNode { 14 | private String methodQualifiedName; 15 | private List spoonCGNodeList; 16 | 17 | public SpoonCGNode(String methodQualifiedName) { 18 | this.methodQualifiedName = methodQualifiedName; 19 | this.spoonCGNodeList = new LinkedList<>(); 20 | } 21 | 22 | public SpoonCGNode(String methodQualifiedName, List spoonCGNodeList) { 23 | this.methodQualifiedName = methodQualifiedName; 24 | this.spoonCGNodeList = spoonCGNodeList; 25 | } 26 | 27 | 28 | public String getMethodQualifiedName() { 29 | return methodQualifiedName; 30 | } 31 | 32 | public void setMethodQualifiedName(String methodQualifiedName) { 33 | this.methodQualifiedName = methodQualifiedName; 34 | } 35 | 36 | public List getSpoonCGDotList() { 37 | return spoonCGNodeList; 38 | } 39 | 40 | public void setSpoonCGDotList(List spoonCGNodeList) { 41 | this.spoonCGNodeList = spoonCGNodeList; 42 | } 43 | 44 | public boolean appendSpoonCGDotList(SpoonCGNode spoonCGNode) { 45 | return this.spoonCGNodeList.add(spoonCGNode); 46 | } 47 | } -------------------------------------------------------------------------------- /src/main/java/org/nhjclxc/cg/SpoonCGProcessor.java: -------------------------------------------------------------------------------- 1 | package org.nhjclxc.cg; 2 | 3 | import spoon.Launcher; 4 | import spoon.processing.AbstractProcessor; 5 | import spoon.reflect.declaration.CtMethod; 6 | 7 | import java.util.Map; 8 | 9 | 10 | /** 11 | * Spoon处理器 12 | * 13 | * @author 罗贤超 14 | * @since 2023/10/30 11:34 15 | */ 16 | public class SpoonCGProcessor extends AbstractProcessor> { // 泛型CtMethod 表示对方法级别的处理 17 | 18 | private final SpoonCGVisitor spoonCGVisitor = new SpoonCGVisitor(); 19 | 20 | @Override 21 | public void process(CtMethod element) { 22 | element.accept(spoonCGVisitor); 23 | } 24 | 25 | public void build(String path) { 26 | 27 | Launcher launcher = new Launcher(); 28 | 29 | // 设置源码目录 30 | launcher.addInputResource(path); 31 | // 设置输出目录(可选) 该输出就是你对代码修改过后的结果,如果你只是对代码进行读取操作那么不需要设备该目录 32 | String outputPath = "output"; 33 | // launcher.setSourceOutputDirectory(outputPath); 34 | 35 | // 添加自定义Processor (MySpoonProcessor) 36 | launcher.addProcessor(this); 37 | 38 | // 运行Spoon 39 | launcher.run(); 40 | 41 | // 获取方法节点数据 42 | Map spoonCGNodeMap = this.spoonCGVisitor.getSpoonCGNodeMap(); 43 | 44 | FileUtils.writeDotFile(outputPath, spoonCGNodeMap); 45 | 46 | System.out.println(""); 47 | System.out.println("解析成功,文件已生成,请在output文件夹下查收"); 48 | System.out.println(""); 49 | 50 | 51 | } 52 | 53 | public static void main(String[] args) { 54 | 55 | // path可以是文件夹或是单个文件 56 | String path = "E:\\nbu\\other\\java-callgraph-spoon\\src\\main\\java\\org\\nhjclxc"; 57 | SpoonCGProcessor spoonCGProcessor = new SpoonCGProcessor(); 58 | spoonCGProcessor.build(path); 59 | 60 | } 61 | } -------------------------------------------------------------------------------- /src/main/java/org/nhjclxc/cg/SpoonCGVisitor.java: -------------------------------------------------------------------------------- 1 | package org.nhjclxc.cg; 2 | 3 | import spoon.reflect.code.CtCodeSnippetExpression; 4 | import spoon.reflect.code.CtConstructorCall; 5 | import spoon.reflect.code.CtInvocation; 6 | import spoon.reflect.declaration.*; 7 | import spoon.reflect.reference.CtExecutableReference; 8 | import spoon.reflect.visitor.CtScanner; 9 | 10 | import java.util.*; 11 | 12 | /** 13 | * Spoon抽象语法树访问者 14 | * 15 | * @author 罗贤超 16 | * @since 2023/10/30 11:34 17 | */ 18 | public class SpoonCGVisitor extends CtScanner { 19 | 20 | /** 21 | * <方法完全限定名, 解析到的方法对象> 22 | */ 23 | private final Map spoonCGNodeMap = new HashMap<>(); 24 | /** 25 | * 已经访问过的对象 26 | */ 27 | private final Set visitedMethodSet = new HashSet<>(); 28 | 29 | protected Map getSpoonCGNodeMap() { 30 | // 移除系统对象 31 | spoonCGNodeMap.entrySet().removeIf(entry -> !visitedMethodSet.contains(entry.getKey())); 32 | return spoonCGNodeMap; 33 | } 34 | 35 | @Override 36 | public void visitCtMethod(CtMethod ctMethod) { 37 | if (ctMethod.getModifiers().contains(ModifierKind.ABSTRACT)) { 38 | return; 39 | } 40 | String methodQualifiedName = getMethodQualifiedName(ctMethod); 41 | // System.out.println("methodQualifiedName: " + methodQualifiedName); 42 | if (visitedMethodSet.contains(methodQualifiedName)) { 43 | return; 44 | } 45 | visitedMethodSet.add(methodQualifiedName); 46 | 47 | 48 | SpoonCGNode spoonCGNode = getSpoonCGNode(methodQualifiedName); 49 | List spoonCGNodeList = spoonCGNode.getSpoonCGDotList(); 50 | 51 | // 处理方法 52 | for (CtElement element : ctMethod.getBody().getElements(null)) { 53 | String invocationedMethodQualifiedName = null; 54 | if (element instanceof CtConstructor) { 55 | CtConstructor ctConstructor = (CtConstructor) element; 56 | System.out.println("CtConstructor"); 57 | } 58 | if (element instanceof CtInvocation) { 59 | CtInvocation ctInvocation = (CtInvocation) element; 60 | CtExecutableReference executable = ctInvocation.getExecutable(); 61 | String qualifiedName = null; 62 | try { 63 | qualifiedName = executable.getDeclaringType().getQualifiedName(); 64 | } catch (Exception ignored) { 65 | } 66 | if (qualifiedName == null) { 67 | qualifiedName = executable.getType().toString(); 68 | } 69 | invocationedMethodQualifiedName = qualifiedName + "." + executable; 70 | } else if (element instanceof CtConstructor) { 71 | CtConstructor ctConstructor = (CtConstructor) element; 72 | System.out.println("CtConstructor"); 73 | } 74 | if (element instanceof CtConstructorCall) { 75 | CtExecutableReference executable = ((CtConstructorCall) element).getExecutable(); 76 | invocationedMethodQualifiedName = executable.toString(); 77 | } else if (element instanceof CtExecutableReference) { 78 | // CtExecutableReference ctExecutableReference = (CtExecutableReference) element; 79 | // invocationedMethodQualifiedName = ctExecutableReference.getDeclaringType().getQualifiedName() + "." + ctExecutableReference; 80 | } else if (element instanceof CtCodeSnippetExpression) { 81 | CtCodeSnippetExpression ctCodeSnippetExpression = (CtCodeSnippetExpression) element; 82 | System.out.println("CtCodeSnippetExpression"); 83 | } 84 | 85 | if (invocationedMethodQualifiedName == null) continue; 86 | 87 | // invocationedMethodQualifiedNameList.add(invocationedMethodQualifiedName); 88 | 89 | SpoonCGNode invocationedSpoonCGNode = getSpoonCGNode(invocationedMethodQualifiedName); 90 | // 存入当前方法的调用列表 91 | spoonCGNodeList.add(invocationedSpoonCGNode); 92 | } 93 | 94 | } 95 | 96 | /** 97 | * 获取已经解析的对象 98 | * 99 | * @param methodQualifiedName 方法完全限定名 100 | * @return cg节点对象 101 | * @author 罗贤超 102 | */ 103 | private SpoonCGNode getSpoonCGNode(String methodQualifiedName) { 104 | SpoonCGNode invocationedSpoonCGNode = spoonCGNodeMap.get(methodQualifiedName); 105 | if (invocationedSpoonCGNode == null) { 106 | invocationedSpoonCGNode = new SpoonCGNode(methodQualifiedName); 107 | spoonCGNodeMap.put(methodQualifiedName, invocationedSpoonCGNode); 108 | } 109 | return invocationedSpoonCGNode; 110 | } 111 | 112 | /** 113 | * 获取方法完全限定名

114 | * package.class.method(parmaterList): returnType
115 | * 116 | * @param method 方法节点 117 | * @param 节点泛型 118 | * @return package.class.method(parmaterList): returnType 119 | * @author 罗贤超 120 | */ 121 | private String getMethodQualifiedName(CtMethod method) { 122 | // 获取声明该方法的类 123 | CtType declaringType = method.getDeclaringType(); 124 | 125 | // 获取包名 126 | String packageName = declaringType.getPackage().getQualifiedName(); 127 | // System.out.println("Package: " + packageName); 128 | 129 | // 获取类名 130 | String className = declaringType.getSimpleName(); 131 | // System.out.println("Class Name: " + className); 132 | 133 | // 方法名 134 | String methodName = method.getSignature(); 135 | // System.out.println("Method: " + methodName); 136 | 137 | // 返回值类型 138 | String returnType = method.getType().getQualifiedName(); 139 | // System.out.println("returnType: " + returnType); 140 | 141 | // 方法修饰符 142 | // String methodModifier = getMethodModifier(method.getModifiers()); 143 | 144 | return packageName + "." + className + "." + methodName;// + ": " + returnType; 145 | } 146 | 147 | /** 148 | * 获取方法修饰符 149 | * 150 | * @param modifiers 修饰符列表 151 | * @return 修饰符 152 | * @author 罗贤超 153 | */ 154 | public String getMethodModifier(Set modifiers) { 155 | String methodModifier = ""; 156 | if (modifiers.contains(ModifierKind.PUBLIC)) { 157 | methodModifier += ModifierKind.PUBLIC + " "; 158 | } 159 | if (modifiers.contains(ModifierKind.PROTECTED)) { 160 | methodModifier += ModifierKind.PROTECTED + " "; 161 | } 162 | if (modifiers.contains(ModifierKind.PRIVATE)) { 163 | methodModifier += ModifierKind.PROTECTED + " "; 164 | } 165 | if (modifiers.contains(ModifierKind.ABSTRACT)) { 166 | methodModifier += ModifierKind.ABSTRACT + " "; 167 | } 168 | if (modifiers.contains(ModifierKind.STATIC)) { 169 | methodModifier += ModifierKind.STATIC + " "; 170 | } 171 | if (modifiers.contains(ModifierKind.FINAL)) { 172 | methodModifier += ModifierKind.FINAL + " "; 173 | } 174 | if (modifiers.contains(ModifierKind.SYNCHRONIZED)) { 175 | methodModifier += ModifierKind.SYNCHRONIZED + " "; 176 | } 177 | if (modifiers.contains(ModifierKind.NATIVE)) { 178 | methodModifier += ModifierKind.SYNCHRONIZED + " "; 179 | } 180 | if (modifiers.contains(ModifierKind.STRICTFP)) { 181 | methodModifier += ModifierKind.STRICTFP + " "; 182 | } 183 | if (modifiers.contains(ModifierKind.TRANSIENT)) { 184 | methodModifier += ModifierKind.TRANSIENT + " "; 185 | } 186 | if (modifiers.contains(ModifierKind.VOLATILE)) { 187 | methodModifier += ModifierKind.VOLATILE + " "; 188 | } 189 | return methodModifier; 190 | } 191 | } -------------------------------------------------------------------------------- /src/main/java/org/nhjclxc/graphviz/GraphvizAssistant.java: -------------------------------------------------------------------------------- 1 | package org.nhjclxc.graphviz; 2 | 3 | import java.io.*; 4 | 5 | /** 6 | * Graphviz图片生成助手

7 | * 8 | * @author LuoXianchao 9 | * @since 2023/10/30 23:36 10 | */ 11 | public class GraphvizAssistant { 12 | 13 | /** 14 | * The image size in dpi. 96 dpi is normal size. Higher values are 10% higher each. Lower values 15 | * 10% lower each. 16 | *

17 | * dpi patch by Peter Mueller 18 | */ 19 | private static final int[] dpiSizes = {46, 51, 57, 63, 70, 78, 86, 96, 106, 116, 128, 141, 155, 170, 187, 206, 226, 249}; 20 | 21 | /** 22 | * Define the index in the image size array. 23 | */ 24 | private static final int currentDpiPos = 14; 25 | 26 | /** 27 | * Graphviz软件安装路径 28 | */ 29 | private static final String executable = "D:\\develop\\Graphviz\\bin\\dot.exe"; 30 | 31 | 32 | /** 33 | * 从dot语言生成image 34 | * It will call the external dot program, and return the image in binary format. 35 | * 36 | * @param dotFile Source of the graph (in dot language). 37 | * @param imageType Type of the output image to be produced, e.g.: gif, dot, fig, pdf, ps, svg, png. 38 | * @param representationType Type of how you want to represent the graph: 39 | *

    40 | *
  • dot
  • 41 | *
  • neato
  • 42 | *
  • fdp
  • 43 | *
  • sfdp
  • 44 | *
  • twopi
  • 45 | *
  • circo
  • 46 | *
47 | * @author 罗贤超 48 | */ 49 | public static void createImage(final File dotFile, final String imageType, final String representationType) { 50 | try { 51 | String filePathPerfix = getFilePathPerfix(dotFile.getAbsolutePath()); 52 | File imageFile = new File(filePathPerfix + "." + imageType); 53 | 54 | final Runtime rt = Runtime.getRuntime(); 55 | final String[] args = {executable, "-T" + imageType, "-K" + representationType, "-Gdpi=" + dpiSizes[currentDpiPos], 56 | dotFile.getAbsolutePath(), "-o", imageFile.getAbsolutePath()}; 57 | final Process process = rt.exec(args); 58 | process.waitFor(); 59 | 60 | // System.out.println("文件写入成功"); 61 | } catch (final IOException | InterruptedException e) { 62 | e.printStackTrace(); 63 | } 64 | 65 | } 66 | 67 | /** 68 | * 获取文件路径前缀:path\filename,没有扩展名 69 | */ 70 | private static String getFilePathPerfix(String fileName) { 71 | int dotIndex = fileName.lastIndexOf("."); 72 | if (dotIndex != -1) { 73 | return fileName.substring(0, dotIndex); 74 | } 75 | return ""; 76 | } 77 | 78 | } 79 | --------------------------------------------------------------------------------