Вопрос

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

Думая, что C — это .class, а J — это файл .java, для которого нам нужно вычислить 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();
  }
}

Здесь m = 6 и r = 9 (не беспокойтесь о вызове внутри петли.Это считается за один звонок)

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

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

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

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

или

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

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

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

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

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


ОБНОВЛЯТЬ:
@МакдауэллПохоже, с помощью BCEL я могу упростить весь процесс.Позвольте мне попробовать.

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top