Pregunta

El RFC para una clase de Java es el conjunto de todos los métodos que se pueden invocar en respuesta a un mensaje a un objeto de la clase o por algún método en la clase.RFC = M + R, donde M = Número de métodos de la clase.R = número Total de otros métodos de invocar directamente de la M.

El pensamiento C es el .clase y J es el .archivo java de la que necesitamos para calcular el 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();
  }
}

aquí M=6 y R=9 (no se preocupe acerca de la llamada dentro de un bucle.Se considera como una sola llamada)

El cálculo de M es fácil.Carga de C usando el cargador de clases y el uso de la reflexión para obtener el número de métodos.

El cálculo de R no es directa.Tenemos que contar el número de llamadas a métodos de la clase.Primer nivel solamente.

Para el cálculo de R I debe usar regex.Normalmente, el formato sería (llamadas sin usar .no se cuentan)

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

o

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

con punto y coma cuando la llamada de retorno es directamente se convierte en parámetro a otro método.o

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

esto se convierte en dos llamadas al método

¿Qué otros patrones de la llamada al método se puede pensar?Hay alguna otra forma que no sea mediante Expresiones regulares que pueden ser utilizados para calcular R.


ACTUALIZACIÓN:
@McDowell Se ve como el uso de BCEL me puede simplificar todo el proceso.Déjame intentarlo.

¿Fue útil?

Solución

Usted podría utilizar la Código De Bytes De Biblioteca De Ingeniería con los binarios.Usted puede utilizar un DescendingVisitor para visitar una clase de " miembros y referencias.Lo he utilizado para encontrar la clase de dependencias.

Alternativamente, usted podría reutilizar algún modelo de los archivos de origen.Estoy bastante seguro de que el editor de Java en el Eclipse JDT está respaldado por algún tipo de modelo.

Otros consejos

Usted debe encontrar su respuesta en la La especificación del lenguaje Java.

Usted se ha olvidado de método estático de llamada, llamada de método dentro de los parámetros...

Llamar a un método de uso de la reflexión (el nombre del método es en una cadena).

Hace M incluye llamadas a sus propios métodos?O las llamadas a las clases internas?Por ejemplo:

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

¿Cuál sería el valor de M de este ser?Sólo hay tres llamadas de función a un método no definidos en esta clase (las llamadas en el d() y g() funciones).¿Desea incluir llamadas a las clases internas, o las llamadas a la clase principal realizado en el interior de la clase?¿Desea incluir llamadas a otros métodos en la misma clase?

Si usted está buscando en las llamadas a métodos, independientemente de la fuente, a continuación, un regex probablemente podría trabajar, pero sería difícil de conseguir (no su expresión regular adecuadamente ignorar las cadenas que contienen llamada al método como contenido?Maneja las llamadas de constructor correctamente?).Si usted se preocupa por el origen de la llamada al método, a continuación, expresiones regulares probablemente no va a obtener lo que desea.Usted tendría que utilizar la reflexión (aunque por desgracia no sé lo suficiente acerca de la reflexión para ser útil).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top