我想使用 jqAssistant 从给定方法开始可视化我们代码库的方法链(哪个方法调用哪个方法(。
对于普通方法调用,以下 Cypher 查询有效。workupNotification
是我开始的方法:
MATCH (begin:Method {name: "workupNotification"}) -[INVOKES*1..20]-> (method:Method) WHERE not method:Constructor and exists(method.name) RETURN begin, method, type
但是我们软件中的许多方法调用都是对接口的调用,这些接口的实现在方法中是未知的(具有依赖反转的SOA(。
serviceRegistry.getService(MyServiceInterface.class).serviceMethod();
如何选择此方法的实现(每个接口有两个类实现。一个是自动生成的(代理(,另一个是我感兴趣的那个。
您需要执行 JVM 在运行时为您执行的操作:解析虚拟方法调用。有一个预定义的 jQAssistant 概念,它将调用关系传播到实现子类:java:InvokesOverriddenMethod
。您可以从自己的规则之一中将其作为必需概念引用,也可以从命令行应用它,例如使用 Maven:
mvn jqassistant:analyze -Djqassistant.concepts=java:InvokesOverriddenMethod
该规则记录在手册中,请参阅 http://buschmais.github.io/jqassistant/doc/1.6.0/#java:InvokesOverriddenMethod
(概念的名称不直观,最好用类似java:VirtualInvokes
的东西代替它(。
它已被弃用。在 1.9.0 版本中,应使用以下命令行:
mvn jqassistant:analyze -Djqassistant.concepts=java:VirtualInvokes
http://jqassistant.github.io/jqassistant/doc/1.8.0/#java:VirtualInvokes