Domanda

L'RFC per una classe Java è l'insieme di tutti i metodi che possono essere richiamati in risposta a un messaggio inviato a un oggetto della classe o da qualche metodo nella classe.Rfc = m + r dove m = numero di metodi nella classe.R = Numero totale di altri metodi invocati direttamente da M.

Pensare che C sia il file .class e J sia il file .java di cui dobbiamo calcolare 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();
  }
}

Qui m = 6 e r = 9 (non preoccuparti di chiamare all'interno di un ciclo.È considerata come una singola chiamata)

Calcolare M è facile.Carica C utilizzando classloader e usa la riflessione per ottenere il conteggio dei metodi.

Il calcolo di R non è diretto.Dobbiamo contare il numero di chiamate al metodo dalla classe.Solo primo livello.

Per calcolare R devo usare regex.Di solito il formato sarebbe (chiamate senza utilizzare .non vengono conteggiati)

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

O

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

senza punto e virgola quando il ritorno della chiamata diventa direttamente il parametro di un altro metodo.O

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

questo diventa due chiamate al metodo

A quali altri modelli della chiamata del metodo ti viene in mente?Esiste un altro modo diverso dall'utilizzo di RegEx che può essere utilizzato per calcolare R.


AGGIORNAMENTO:
@McDowellSembra che utilizzando BCEL posso semplificare l'intero processo.Fammi provare.

È stato utile?

Soluzione

Potresti usare il Libreria di ingegneria del codice byte con i binari.Puoi usare a Visitatore discendente per visitare i membri e i riferimenti di una classe.L'ho usato per trovare le dipendenze delle classi.

In alternativa, potresti riutilizzare alcuni modelli dei file sorgente.Sono abbastanza sicuro che l'editor Java nel file Eclissi JDT è supportato da una qualche forma di modello.

Altri suggerimenti

Dovresti trovare la risposta nel Specifica del linguaggio Java.

Hai dimenticato la chiamata al metodo statico, la chiamata al metodo all'interno dei parametri...

Chiamare un metodo utilizzando la riflessione (il nome del metodo è in una stringa).

M include chiamate ai propri metodi?O chiamate alle classi interne?Ad esempio:

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

Quale sarebbe il valore M di questo?Ci sono solo tre chiamate di funzione a un metodo non definito in questa classe (le chiamate nelle funzioni d() e g()).Vuoi includere chiamate alle classi interne o chiamate alla classe principale effettuate nella classe interna?Vuoi includere chiamate ad altri metodi sulla stessa classe?

Se stai esaminando qualsiasi chiamata di metodo, indipendentemente dall'origine, allora una regex potrebbe probabilmente funzionare, ma sarebbe difficile da ottenere correttamente (la tua regex ignora correttamente le stringhe che contengono contenuti simili a chiamate di metodo?Gestisce correttamente le chiamate del costruttore?).Se ti interessa l'origine della chiamata al metodo, le espressioni regolari probabilmente non ti daranno ciò che desideri.Dovresti usare la riflessione (anche se sfortunatamente non ne so abbastanza sulla riflessione per essere utile lì).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top