Существует небольшая разница между вызовами super.superMethod()
и superMethod()
:
. Первый инструктирует JVM использовать метод из суперкласса, второй полагается на разрешение метода во время выполнения, возможно, реализация в SubClass2
(виртуальный вызов):
Для этого случая созданный граф содержит вызов метки-заполнителя метода в SubClass2
(только со свойством подписи):
(method)-[:INVOKES]->(:Method{signature:"void superMethod()"})<-[:DECLARES]-(:Type{name:"SubClass2"})
Существует концепция java:MethodOverrides
, которая должна создать отношение OVERRIDES
к методу суперкласса, но, к сожалению, в этом случае он не работает (до jQA 1.8.0). Уже есть исправление, которое будет поставляться с jQA 1.9.0:
MATCH
(type:Type)-[:DECLARES]->(method:Method),
(superType:Type)-[:DECLARES]->(superMethod:Method),
path=shortestPath((type)-[:EXTENDS|IMPLEMENTS*]->(superType))
WHERE
method.signature = superMethod.signature
and superMethod.visibility <> "private"
WITH
type, method, superType, superMethod, length(path) as depth
ORDER BY
depth asc
WITH
method, head(collect(superMethod)) as overriddenMethod
MERGE
(method)-[:OVERRIDES]->(overriddenMethod)
RETURN
count(*) as OverriddenMethods
С его помощью вы сможете выполнить следующий запрос:
MATCH
(:Type{name:"SuperClass"})-[:DECLARES]->(m:Method{name:"superMethod"}),
(who)-[:INVOKES]->(:Method)-[:OVERRIDES*0..1]->(m) // catching direct or virtual invocations
RETURN
who