Frage

Der RFC für eine Java-Klasse besteht aus allen Methoden, die als Reaktion auf eine Nachricht an ein Objekt der Klasse oder durch eine Methode in der Klasse aufgerufen werden können.RFC = M + R wobei m = Anzahl der Methoden in der Klasse.R = Gesamtzahl anderer Methoden, die direkt vom M aufgerufen werden.

Denken Sie, dass C die .class und J die .java-Datei ist, deren wir RFC berechnen müssen.

class J{

 a(){}
 b(){}
 c(){
   e1.e();
   e1.f();
   e1.g();
 }
 h(){
   i.k();
   i.j();
  }
  m(){}
  n(){
   i.o();
   i.p();
   i.p();
   i.p();
  }
}

Hier M = 6 und R = 9 (Mach dir keine Sorgen um den Anruf in einer Schleife.Es wird als ein einzelner Anruf betrachtet)

Die Berechnung von M ist einfach.Laden Sie C mit dem Klassenlader und verwenden Sie Reflektion, um die Anzahl der Methoden zu ermitteln.

Die Berechnung von R ist nicht direkt.Wir müssen die Anzahl der Methodenaufrufe der Klasse zählen.Nur erste Ebene.

Zur Berechnung von R muss ich Regex verwenden.Normalerweise wäre das Format (Aufrufe ohne Verwendung von .werden nicht gezählt)

[variable_name].[method_name]([zero or more parameters]);

oder

[variable_name].[method_name]([zero or more parameters])

ohne Semikolon, wenn der Aufruf return direkt zum Parameter einer anderen Methode wird.oder

[variable_name].[method_name]([zero or more parameters]).method2();

Dies sind zwei Methodenaufrufe

Welche anderen Muster des Methodenaufrufs fallen Ihnen ein?Gibt es eine andere Möglichkeit als die Verwendung von RegEx, mit der R berechnet werden kann?


AKTUALISIEREN:
@McDowellEs sieht so aus, als ob ich mit BCEL den gesamten Prozess vereinfachen kann.Lass mich es versuchen.

War es hilfreich?

Lösung

Du könntest das verwenden Bytecode-Engineering-Bibliothek mit Binärdateien.Sie können a verwenden Absteigender Besucher um die Mitglieder und Referenzen einer Klasse zu besuchen.Ich habe es verwendet Klassenabhängigkeiten finden.

Alternativ können Sie ein Modell der Quelldateien wiederverwenden.Ich bin mir ziemlich sicher, dass der Java-Editor im Eclipse JDT wird durch eine Art Modell gestützt.

Andere Tipps

Ihre Antwort sollten Sie in der finden Java-Sprachspezifikation.

Sie haben den statischen Methodenaufruf und den Methodenaufruf innerhalb der Parameter vergessen ...

Aufrufen einer Methode mithilfe von Reflektion (der Name der Methode befindet sich in einer Zeichenfolge).

Enthält M Aufrufe seiner eigenen Methoden?Oder Aufrufe an innere Klassen?Zum Beispiel:

class J {
  a() { }
  b() { this.a(); }
  c() { jj.aa(); }
  d() { i.k(); }
  e() { this.f().a(); }
  f() { return this; }
  g() { i.m().n(); }

  class JJ {
    aa() { a(); }
  }
}

Was wäre der M-Wert davon?Es gibt nur drei Funktionsaufrufe für eine Methode, die in dieser Klasse nicht definiert ist (die Aufrufe in den Funktionen d() und g()).Möchten Sie Aufrufe an innere Klassen oder Aufrufe an die Hauptklasse, die in der inneren Klasse erfolgen, einbeziehen?Möchten Sie Aufrufe anderer Methoden derselben Klasse einschließen?

Wenn Sie sich Methodenaufrufe ansehen, unabhängig von der Quelle, dann könnte ein regulärer Ausdruck wahrscheinlich funktionieren, aber es wäre schwierig, ihn richtig hinzubekommen (Ignoriert Ihr regulärer Ausdruck ordnungsgemäß Zeichenfolgen, die methodenaufrufähnliche Inhalte enthalten?)Verarbeitet es Konstruktoraufrufe ordnungsgemäß?).Wenn Sie sich für die Quelle des Methodenaufrufs interessieren, werden Sie mit regulären Ausdrücken wahrscheinlich nicht das bekommen, was Sie wollen.Sie müssten Reflexion verwenden (obwohl ich leider nicht genug über Reflexion weiß, um dort hilfreich zu sein).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top