查找接口方法的实现

Find implementation of interface method

我想用 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 with Dependency Inversion)。

serviceRegistry.getService(MyServiceInterface.class).serviceMethod();

如何select实现这个方法(每个接口有两个类实现,一个是自动生成的(Proxy),一个是我感兴趣的。 )

您需要执行 JVM 在运行时为您执行的操作:解析虚拟方法调用。有一个预定义的 jQAssistant 概念,它传播 INVOKES 关系以实现 sub-类: 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