Adrninistrator
Adrninistrator
判断指定的两个方法之间是否存在调用关系(直接或间接的),从调用方法开始向下查找 - 步骤1 同上,只需要执行一次 - 步骤2 同上,只需要执行一次 - 步骤3 通过`com.adrninistrator.jacg.extractor.entry.CallerGraphBaseExtractor:baseExtract()`方法,判断指定的两个方法之间是否存在调用关系(直接或间接的) 在`OtherConfigFileUseSetEnum.OCFUSE_METHOD_CLASS_4CALLER`参数中指定调用方法 在`OtherConfigFileUseListEnum.OCFULE_FIND_STACK_KEYWORD_4ER`参数中指定被调用方法 为了判断`test.call_graph.annotation.CallMethodWithAnnotation:test1()`是否有直接或间接调用`test.call_graph.annotation.MethodWithAnnotation:test1()`方法 可执行`test.run_by_code.extractor.TestMethodCallRelationshipByER`类 若有调用,则以上baseExtract()方法返回的list非空,示例略,在_jacg_o_er目录中会生成对应的方法调用堆栈文件
java-all-call-graph是用来生成调用链的,把调用关系写到数据库之后再读取出来,用来生成调用链
写了一个测试代码: ```java public class TestLambda { public void testList() { List list = new ArrayList(); list.forEach(e -> testString(e)); } private void testString(String data) { System.out.println(data); } } ``` 生成的方法调用关系如下: ```...
gradle文件里有邮箱
生成jar包时需要执行`gradlew gen_run_jar`命令来生成,这样会把依赖的组件拷贝到对应目录中,上面报错看起来是依赖组件不在对应的目录里
如果多个jar包是一个项目中的不同的模块,这种情况下最好是把相关的jar包同时在配置文件中指定,因为各个jar包的类之间的实现和继承的关系可以识别出来 如果分开处理的话,这些类的实现和继承判断就没有办法识别,所以分开处理和一起处理的结果会有不同
一般情况下,如果多个jar包之间是有相互使用关系的话,一起分析的结果应该是符合预期的,分开分析会丢失一些信息
这几个类在另外一个组件里,使用Maven时可以手工添加一下,参考[https://repo1.maven.org/maven2/com/github/adrninistrator/java-all-call-graph/1.0.14/java-all-call-graph-1.0.14.pom](https://repo1.maven.org/maven2/com/github/adrninistrator/java-all-call-graph/1.0.14/java-all-call-graph-1.0.14.pom) ```xml com.github.adrninistrator mybatis-mysql-table-parser 0.0.5 compile ``` 使用Gradle时应该能自动添加依赖
现在处理时满足条件的类的方法都会解析再写到数据库里,如果在生成调用链时需要忽略这些方法,可以在配置文件`ignore_method_prefix.properties`里指定方法名前缀 如果在表的字段加app_name来区分的话,可能不会特别方便,比如表结构有变更需要drop掉,或者是需要清理表数据时,按表清理比按表加字段条件清理要更简单一些,如果多个应用的话可以考虑创建多个库,如果放在同一个库里应该也不会太麻烦,批量操作时可以根据表名后缀查表表名后再处理
之前通过邮件回复的看起来没有生效,这里获取到的行号是java文件编译成class文件之后的值,可能和直观上从java代码里看到的行号会不完全一样,但结果是没有问题的 可以参考test模块中的这个类,test.call_graph.future.TestFuture ```java public void test4() throws ExecutionException, InterruptedException { int b = 1; FutureTaskChild futureTaskChild = new FutureTaskChild(() -> { int a = 1; System.getProperty(""); return null; }); futureTaskChild.get();...