Сведения о вопросе

rjevskii

20:01, 19th August, 2020

Теги

java   regex   algorithm   reflection    

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

Просмотров: 555   Ответов: 4

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

Мышление 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();
  }
}

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

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

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

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

[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:
@McDowell похоже, что с помощью BCEL я могу упростить весь процесс. Дай мне попробовать.



  Сведения об ответе

DO__IT

23:40, 17th August, 2020

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

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


  Сведения об ответе

DINO

00:57, 15th August, 2020

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

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


  Сведения об ответе

appple

07:01, 23rd August, 2020

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


  Сведения об ответе

lats

22:24, 20th August, 2020

Включает ли 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()). Вы хотите включить вызовы внутренних классов или вызовы основного класса, сделанные во внутреннем классе? Вы хотите включить вызовы других методов в том же классе?

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться