Adrninistrator

Results 291 comments of Adrninistrator

反射现在没有处理,如果是用JDK提供的方法来处理,应该也能识别,如果有封装公共方法就要专门处理 异步线程调用现在支持 SDK是指什么,部分jar包没有包含添加到需要分析的jar包里吗,这种只会分析到其他方法有调用sdk中的方法,sdk的方法再往下的方法调用不会有信息

把需要分析的jar包都在配置文件参数里指定就可以了,一个jar包或者多个jar包都可以

有另外一个项目,会把生成的txt文件数据写到数据库里,可以从数据库里获取需要的数据,看具体要做什么样的操作 写入数据库的类参考[https://github.com/Adrninistrator/java-all-call-graph/blob/main/java-all-call-graph/src/test/java/test/run_by_code/TestRBC0RunnerWriteDb.java](https://github.com/Adrninistrator/java-all-call-graph/blob/main/java-all-call-graph/src/test/java/test/run_by_code/TestRBC0RunnerWriteDb.java)

方法的调用不会出现在`method_call`表里 方法调用的被调用对象,或者被调用参数涉及到类的静态字段时,相关信息会保存在`method_call_info`表中,通过`call_id`字段关联到`method_call`表 但是对于String之类的类型,这些在class文件里是常量的形式,不会有静态字段形式存在

> 方法的调用不会出现在`method_call`表里 > > 方法调用的被调用对象,或者被调用参数涉及到类的静态字段时,相关信息会保存在`method_call_info`表中,通过`call_id`字段关联到`method_call`表 > > 但是对于String之类的类型,这些在class文件里是常量的形式,不会有静态字段形式存在 对应的txt文件是`method_call_info.txt`

- method_info 方法的信息,完整方法及access_flags、返回类型等 - method_info 方法调用,调用方法和被调用方法的信息 - method_call_info 方法调用中,被调用对象和参数涉及的可能的值和类型 - method_arg_generics_type 方法的参数中涉及的泛型中的类型,比如List - method_return_generics_type 方法的返回类型中涉及的泛型中的类型,比如List 可以参考sql文件中的COMMENT

***@***.*** @Getter @Setter这些注解在编译时会生成对应的get/set方法,这些注解不会生成到class文件里,所以会找不到 要获得这些注解的话,需要解析java源码才能得到,比如用javaparser解析

[https://github.com/Adrninistrator/java-all-call-graph/blob/main/java-all-call-graph/src/main/java/com/adrninistrator/jacg/extractor/entry/CallerGraphBaseExtractor.java](https://github.com/Adrninistrator/java-all-call-graph/blob/main/java-all-call-graph/src/main/java/com/adrninistrator/jacg/extractor/entry/CallerGraphBaseExtractor.java) 使用这个类的baseExtract()方法 先生成A函数向下的方法完整调用链 再根据B函数查找A函数间接调用B函数的调用堆栈(需要把B函数配置在`_jacg_find_stack_keyword/find_stack_keyword_4er.properties`文件中) 最后获取对应的调用堆栈文件及相关信息 对类的设置可以参考[https://github.com/Adrninistrator/java-all-call-graph/blob/main/java-all-call-graph/src/test/java/test/run_by_code/base/TestRunByCodeBase.java](https://github.com/Adrninistrator/java-all-call-graph/blob/main/java-all-call-graph/src/test/java/test/run_by_code/base/TestRunByCodeBase.java),和配置文件的参数是对应的 文档现在还没时间整理

上面是从上往下查找的方式,从下往上查找也可以: [https://github.com/Adrninistrator/java-all-call-graph/blob/main/java-all-call-graph/src/main/java/com/adrninistrator/jacg/extractor/entry/CalleeGraphEntryExtractor.java](https://github.com/Adrninistrator/java-all-call-graph/blob/main/java-all-call-graph/src/main/java/com/adrninistrator/jacg/extractor/entry/CalleeGraphEntryExtractor.java) 使用这个类的extract()方法 先生成B函数向上的方法完整调用链 再根据A函数查找B函数间接被A函数调用的调用堆栈(需要把A函数配置在`_jacg_find_stack_keyword/find_stack_keyword_4ee.properties`文件中) 最后获取对应的调用堆栈文件及相关信息 如果有需要的话我可以提交一个示例代码

判断指定的两个方法之间是否存在调用关系(直接或间接的),从被调用方法开始向上查找 使用[https://github.com/Adrninistrator/java-all-call-graph](https://github.com/Adrninistrator/java-all-call-graph)项目: - 步骤1 执行`gradlew test_jar`命令 生成示例代码的jar包 - 步骤2 执行`test.run_by_code.TestRBC0RunnerWriteDb`类 解析示例代码jar包,并写入数据库 - 步骤3 通过`com.adrninistrator.jacg.extractor.entry.CalleeGraphBaseExtractor:baseExtract()`方法,判断指定的两个方法之间是否存在调用关系(直接或间接的) 在`OtherConfigFileUseSetEnum.OCFUSE_METHOD_CLASS_4CALLEE`参数中指定被调用方法 在`OtherConfigFileUseListEnum.OCFULE_FIND_STACK_KEYWORD_4EE`参数中指定调用方法 为了判断`test.call_graph.annotation.CallMethodWithAnnotation:test1()`是否有直接或间接调用`test.call_graph.annotation.MethodWithAnnotation:test1()`方法 可执行`test.run_by_code.extractor.TestMethodCallRelationshipByEE`类 若有调用,则以上baseExtract()方法返回的list非空,示例略,在_jacg_o_ee目录中会生成对应的方法调用堆栈文件 `建议使用这种方式,从被调用方法开始向上查找,需要处理的方法调用比较少`