Вот вариант с использованием pmap
library(purrr)
library(dplyr)
set_names(m, c('from', 'to')) %>%
pmap(., seq) %>%
unlist
<час> Или с использованием Map
из base R
unlist(do.call(Map, c(f = `:`, m)))
Я полагаю, вы ищете этот плагин eclipse -> UCDetector
Из документации (обратите внимание на второй пункт маркера)
В большем масштабе, если вы хотите провести статический анализ на уровне объекта, посмотрите этот инструмент от IBM -> Структурный анализ для Java . Это действительно полезно для объектного анализа библиотек, API и т. Д.
Я не думаю, что вы можете измерить, как часто «нужен» класс или функция.
Есть несколько простых вопросов:
Заключение:
Я не знаю, чего вы пытаетесь достичь.
Если вы хотите отобразить зависимости кода, для этого есть другие инструменты . Если вы пытаетесь измерить выполнение кода, для Java есть профилировщик или тесты . Если вы фанат статистики, вы будете счастливы с RapidMiner ;)
Удачи с этим!
Не совсем то, что вы ищете, но:
Нечто подобное можно сделать с помощью инструментов покрытия кода (например, Cobertura ). Они не выполняют статическую проверку исходного кода, но используют байт-код для сбора метрик во время выполнения. Конечно, вам нужно управлять приложением так, чтобы оно использовало все шаблоны использования и могло пропустить более редкие пути кода.
Возможно, вам помогут эти инструменты в статическом анализе (проект Apache использует их для проверки совместимости API для В новых выпусках кажется, что эта задача в некоторой степени связана с тем, что вы пытаетесь сделать):
I would suggest JDepend shows you the dependencies between packages and classes, excellent to find cyclic dependencies! http://clarkware.com/software/JDepend.html (it has an eclipse plugin: http://andrei.gmxhome.de/jdepend4eclipse/
and also PMD for other metrics http://pmd.sourceforge.net/
Вот несколько списков инструментов покрытия кода Java. Я не использовал ни один из них лично, но это может помочь вам начать:
Использование клиентом отражающих вызовов - это одна дыра в статическом анализе, которую следует учитывать. Поскольку нет никакого способа узнать наверняка, что конкретный метод не вызывается через какую-то причудливую схему отражения. Так что, возможно, лучше всего подойдет комбинация времени выполнения и статического анализа.
Proguard также может быть опцией ( http://proguard.sourceforge.net/ ):
"Некоторые варианты использования ProGuard:
См. Также http://proguard.sourceforge.net/manual/examples.html#deadcode
IntelliJ имеет инструмент для обнаружения методов, полей и классов, которые могут иметь более ограниченные модификаторы. В нем также есть быстрое исправление для применения этих изменений, которое также может сэкономить вам много работы. Если вы не хотите платить за это, вы можете получить 30-дневную лицензию на пробную версию, которой более чем достаточно для изменения вашего кода, это не то, что вам нужно делать очень часто.
BTW: IntelliJ имеет около 650 проверок кода для улучшения качества кода, около половины из них содержат автоматические исправления, поэтому я предлагаю потратить пару дней на его использование для рефакторинга / наведения порядка в коде.
Обратите внимание на Детектор мертвого кода . Он утверждает, что делает именно то, что вы ищете: находит неиспользуемый код с помощью статического анализа.
Вы можете написать свою собственную утилиту для этого (в течение часа после прочтения этого), используя библиотеку анализа байт-кода ASM ( http://asm.ow2.org ). Вам нужно будет реализовать ClassVisitor и MethodVisitor. Вы будете использовать ClassReader для анализа файлов классов в вашей библиотеке.
Держите карту для подсчета. Ключи представляют методы (см. Ниже). Вот какой-то код:
class MyClassVisitor {
// ...
public void visit(int version, int access, String name, ...) {
this.className = name;
}
public MethodVisitor visitMethod(int access, String name, String desc, ...):
String key = className + "." + name + "#" + desc;
if (!map.containsKey() {
map.put(key, 0);
}
return new MyMethodVisitor(map);
}
// ...
}
void class MyMethodVisitor {
// ...
public visitMethodInsn(int opcode, String name, String owner, String desc, ...) {
String key = owner + "." + name + "#" + desc;
if (!map.containsKey() {
map.put(key, 0);
}
map.put(key, map.get(key) + 1);
}
// ...
}
В основном это все. Вы начинаете шоу примерно так:
Map<String,Integer> map = new HashMap<String,Integer>();
for (File classFile : my library) {
InputStream input = new FileInputStream(classFile);
new ClassReader(input).accept(new MyClassVisitor(map), 0);
input.close();
}
for (Map.Entry<String,Integer> entry : map.entrySet()) {
if (entry.getValue() == 0) {
System.out.println("Unused method: " + entry.getKey());
}
}
Наслаждайтесь!