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

голоса
2

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

Думая C является .class и J представляет собой файл .java которого необходимо вычислить RFC.

Класс J {

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

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

Вычисление M легко. Нагрузка С помощью загрузчика классов и использовать отражение, чтобы получить количество методов.

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

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

. [Имя_переменный] [имя_метод] ([ноль или более параметры]);

или

[Имя_переменный]. [Имя_метод] ([ноль или более параметры])

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

. [Имя_переменный] [имя_метод] ([ноль или более параметры]) метод2 ().

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

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


UPDATE:
@McDowell Похоже , с помощью BCEL я могу упростить весь процесс. Позвольте мне попробовать.

Задан 21/08/2008 в 14:50
источник пользователем
На других языках...                            


4 ответов

голоса
2

Вы можете использовать Engineering Library Byte Code с двоичными файлами. Вы можете использовать DescendingVisitor , чтобы посетить члены класса и ссылку. Я использовал его , чтобы найти зависимости класса .

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

Ответил 21/08/2008 d 15:01
источник пользователем

голоса
0

Включается ли 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(); }
  }
}

Что бы значение М это может быть? Там только три функциональные вызовы к методу, не определенные в этом классе (звонки в д () и (г) функции). Вы хотите включить вызовы на внутренние классы и вызовы основного класса из во внутреннем классе делать? Вы хотите включить звонки в другие методы на том же классе?

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

Ответил 21/08/2008 d 15:05
источник пользователем

голоса
0

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

Ответил 21/08/2008 d 14:59
источник пользователем

голоса
0

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

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

Ответил 21/08/2008 d 14:57
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more