Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
895
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4351
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Алгоритм для выполнения вычисления RFC в Java
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 я могу упростить весь процесс. Дай мне попробовать.
Вы можете использовать библиотеку разработки байтового кода с двоичными файлами. Вы можете использовать DescendingVisitor для посещения членов и ссылок класса. Я использовал его, чтобы найти зависимости классов .
Кроме того, вы можете повторно использовать некоторые модели исходных файлов. Я почти уверен, что редактор Java в Eclipse 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()). Вы хотите включить вызовы внутренних классов или вызовы основного класса, сделанные во внутреннем классе? Вы хотите включить вызовы других методов в том же классе?
Если вы смотрите на любые вызовы методов, независимо от источника, то regex, вероятно, может работать, но будет сложно получить право (правильно ли ваш regex игнорирует строки, содержащие метод-вызов, подобный содержимому? Правильно ли он обрабатывает вызовы конструктора?). Если вы заботитесь об источнике вызова метода, то регулярные выражения, вероятно, не дадут вам то, что вы хотите. Вам нужно будет использовать отражение (хотя, к сожалению, я не знаю достаточно о отражении, чтобы быть полезным там).