RFC для класса Java - это набор всех методов, которые могут быть вызваны в ответ на сообщение объекту класса или некоторым методом в классе.
RFC = M + R, где
M = количество методов в классе.
R = общее количество других методов, напрямую вызванных из M.
Мышление C - это класс .c, а 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();
}
}
здесь М = 6
и R = 9 (не беспокойтесь о вызове внутри цикла. Он рассматривается как один вызов)
Рассчитать М легко. Загрузите C, используя classloader, и используйте отражение, чтобы получить количество методов.
Расчет 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.
UPDATE:
@ Макдауэлл
Похоже, с помощью BCEL я могу упростить весь процесс. Позвольте мне попробовать.