Алгоритм выполнения RFC-вычисления в Java

RFC для класса Java - это набор всех методов, которые могут быть вызваны в ответ на сообщение объекту класса или некоторым методом в классе. RFC = M + R, где M = количество методов в классе. R = общее количество других методов, напрямую вызванных из M.

Мышление C - это .class, а J - это файл .java, из которого нам нужно рассчитать RFC.

класс J {

 а () {}
 б () {}
 с () {
   e1.e ();
   e1.f ();
   e1.g ();
 }
 час(){
   ик ();
   IJ ();
  }
  м () {}
  п () {
   IO ();
   ф ();
   ф ();
   ф ();
  }
}

здесь M = 6 и R = 9 (не беспокойтесь о вызове внутри цикла. Он рассматривается как один вызов)

Рассчитать М легко. Загрузите C, используя classloader, и используйте отражение, чтобы получить количество методов.

Расчет R не является прямым. Нам нужно посчитать количество вызовов методов из класса. Только первый уровень.

Для расчета RI необходимо использовать регулярное выражение. Обычно формат будет (звонки без использования. Не учитываются)

[variable_name]. [method_name] ([ноль или более параметров]);

или

[variable_name]. [method_name] ([ноль или более параметров])

без точки с запятой, когда возврат вызова напрямую становится параметром для другого метода. или

[variable_name]. [method_name] ([ноль или более параметров]). method2 ();

это становится два вызова метода

Какие еще шаблоны вызова метода вы можете придумать? Есть ли другой способ, кроме использования RegEx, который можно использовать для расчета R.


ОБНОВЛЕНИЕ:
@McDowell Похоже, с помощью BCEL я могу упростить весь процесс. Позволь мне попробовать.

21.08.2008 13:50:35
4 ОТВЕТА
РЕШЕНИЕ

Вы можете использовать Библиотеку Байт-кода с двоичными файлами. Вы можете использовать DescendingVisitor для посещения членов класса и ссылок. Я использовал это, чтобы найти зависимости класса .

В качестве альтернативы, вы можете повторно использовать некоторые модели исходных файлов. Я уверен, что редактор Java в Eclipse JDT опирается на какую-то форму модели.

2
21.08.2008 14:01:58

Вы должны найти свой ответ в спецификации языка Java .

Вы забыли статический вызов метода, вызов метода внутри параметров ...

0
21.08.2008 13:57:06

Вызов метода с использованием отражения (имя метода в строке).

0
21.08.2008 13:59:09

M включает вызовы к своим собственным методам? Или звонки во внутренние классы? Например:

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

Какова будет величина М этого? Существует только три вызова функций для метода, не определенного в этом классе (вызовы функций d () и g ()). Вы хотите включить вызовы во внутренние классы или вызовы основного класса, сделанные во внутреннем классе? Вы хотите включить вызовы других методов в том же классе?

Если вы просматриваете какие-либо вызовы методов, независимо от источника, то, возможно, регулярное выражение может сработать, но это будет непросто сделать правильно (правильно ли ваше регулярное выражение игнорирует строки, содержащие содержимое, похожее на вызов метода? Правильно ли он обрабатывает вызовы конструктора ?). Если вам небезразличен источник вызова метода, регулярные выражения, вероятно, не дадут вам того, что вы хотите. Вам нужно будет использовать рефлексию (хотя, к сожалению, я недостаточно знаю о рефлексии, чтобы быть там полезной).

0
21.08.2008 14:05:49