2016-06-14 3 views
0

Auf der Grundlage der Abfrage in metric.xml definiert Ich versuche, herauszufinden, wie viele Methoden eine Klasse deklariert:Was ist die Semantik der "Deklaration einer Methode"?

MATCH 
    (t:Type:File)-[:DECLARES]->(m:Method) 
WHERE 
    t.fqn=~'.*MyException' 
RETURN 
    t.fqn as Type, COUNT(m) as MethodCount 

Es ist 41.

ich die Abfrage

MATCH 
    (t:Class:File)-[:DECLARES]->(m:Method) 
WHERE 
    t.fqn=~'.*MyException' 
RETURN 
    t.fqn as Type, COUNT(m) as MethodCount 

ändern und Ich bekomme 25 für die gleiche Klasse. Sollte es nicht das gleiche Ergebnis sein? Wenn ich die Klasse öffne und manuell zähle, finde ich nur 23. Was bedeutet es also, wenn eine Klasse oder ein Typ eine Methode "deklariert"? Es scheint, dass einige vererbte Methoden auch gezählt werden, abhängig von: Typ oder: Klasse. Und wie bekomme ich die "echte" Anzahl von Methoden, die von der Klasse selbst ohne ererbte Methoden deklariert werden?

+0

Karo dieser heraus http://stackoverflow.com/questions/1857775/getting-a-list-of-accessible-methods-for -a-given-class-via-reflection – Aravind

Antwort

1

Die Ursache liegt darin, dass derselbe Ausnahmetyp sehr wahrscheinlich als mehrere Knoten verfügbar ist, da er in einem Artefakt enthalten ist und von anderen benötigt wird. Um den „echten“ Knoten verwenden Sie die folgende Abfrage zu finden:

MATCH 
    (:Artifact)-[:CONTAINS]->(t:Type)-[:DECLARES]->(m:Method) 
WHERE 
    t.fqn=~'.*MyException' 
RETURN 
    t.fqn as Type, COUNT(m) as MethodCount 
+0

Auch mit dieser Abfrage bekomme ich zwei zusätzliche Methoden: getCause() und initCause (Throwable) von Throwable. Beide Methoden wurden * von MyException * aufgerufen, aber nicht * in * deklariert. Diese Methoden haben nur eine Signatureigenschaft, so dass ich jetzt korrekt filtern kann, aber vielleicht wäre ein Hinweis in den Dokumenten für metric.xml nett. –

+0

Können Sie ein Beispiel für die Ausnahme angeben, die diese Methoden aufruft? Ich möchte mir den generierten Bytecode ansehen. –

0

Die erste Abfrage findet mehrere Typknoten mit demselben fqn und aggregiert das Ergebnis. Fügen Sie der Rückgabe-Klausel id (t) hinzu und Sie sollten es sehen.

0

Es gab mehrere zusammenhängende Fragen in der ursprünglichen Nachricht. Die Antwort, wie nur die Methoden in einer Klasse deklariert wirklich zu finden ist:

MATCH 
    (:Artifact)-[:CONTAINS]->(t:Type)-[:DECLARES]->(m:Method) 
WHERE 
    t.fqn=~'.*MyException' AND m.name <> '' 
RETURN 
    t.fqn as Type, COUNT(m) as MethodCount 
Verwandte Themen