Question

La RFC pour une classe Java est un ensemble de toutes les méthodes qui peuvent être invoquées en réponse à un message adressé à un objet de la classe ou par une méthode de la classe.Rfc = m + r où m = nombre de méthodes dans la classe.R = Nombre total d'autres méthodes directement invoquées depuis le M.

En pensant que C est le .class et J est le fichier .java dont nous avons besoin pour calculer le RFC.

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();
  }
}

Ici M = 6 et R = 9 (ne vous inquiétez pas pour appeler dans une boucle.C'est considéré comme un seul appel)

Calculer M est facile.Chargez C à l'aide du chargeur de classe et utilisez la réflexion pour obtenir le nombre de méthodes.

Le calcul de R n’est pas direct.Nous devons compter le nombre d’appels de méthode de la classe.Premier niveau uniquement.

Pour calculer R, je dois utiliser regex.Habituellement, le format serait (appels sans utiliser .ne sont pas comptés)

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

ou

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

sans point-virgule lorsque le retour de l'appel devient directement le paramètre d'une autre méthode.ou

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

cela devient deux appels de méthode

À quels autres modèles d’appel de méthode pouvez-vous penser ?Existe-t-il un autre moyen que l'utilisation de RegEx qui peut être utilisé pour calculer R.


MISE À JOUR:
@McDowellOn dirait qu'en utilisant BCEL, je peux simplifier l'ensemble du processus.Laissez-moi essayer.

Était-ce utile?

La solution

Vous pourriez utiliser le Bibliothèque d'ingénierie de code d'octet avec des binaires.Vous pouvez utiliser un Visiteur décroissant pour rendre visite aux membres et aux références d'une classe.Je l'ai utilisé pour trouver les dépendances de classe.

Vous pouvez également réutiliser un modèle des fichiers sources.Je suis presque sûr que l'éditeur Java dans ÉclipseJDT est soutenu par une certaine forme de modèle.

Autres conseils

Vous devriez trouver votre réponse dans le Spécification du langage Java.

Vous avez oublié l'appel de méthode statique, l'appel de méthode dans les paramètres...

Appel d'une méthode par réflexion (le nom de la méthode est dans une chaîne).

M inclut-il des appels à ses propres méthodes ?Ou des appels aux classes internes ?Par exemple:

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(); }
  }
}

Quelle serait la valeur M de ceci ?Il n'y a que trois appels de fonction à une méthode non définie dans cette classe (les appels dans les fonctions d() et g()).Souhaitez-vous inclure les appels aux classes internes ou les appels à la classe principale effectués dans la classe interne ?Voulez-vous inclure des appels à d’autres méthodes sur la même classe ?

Si vous examinez des appels de méthode, quelle que soit la source, alors une regex pourrait probablement fonctionner, mais serait difficile à obtenir correctement (votre regex ignore-t-elle correctement les chaînes qui contiennent un contenu semblable à un appel de méthode ?Gère-t-il correctement les appels du constructeur ?).Si vous vous souciez de la source de l’appel de méthode, les expressions rationnelles ne vous donneront probablement pas ce que vous voulez.Vous devrez utiliser la réflexion (même si, malheureusement, je n'en sais pas assez sur la réflexion pour y être utile).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top