Средство проверки использования кода Java

Вот вариант с использованием pmap

library(purrr)
library(dplyr)
set_names(m, c('from', 'to')) %>%
     pmap(., seq) %>% 
     unlist
<час>

Или с использованием Map из base R

unlist(do.call(Map, c(f = `:`, m)))
5
задан James Van Boxtel 1 June 2009 в 17:51
поделиться

10 ответов

Я полагаю, вы ищете этот плагин eclipse -> UCDetector

Из документации (обратите внимание на второй пункт маркера)

  • Ненужный (мертвый) код
  • Код, при котором видимость может быть изменена на защищенную, по умолчанию или private
  • Методы полей, которые могут быть окончательными

В большем масштабе, если вы хотите провести статический анализ на уровне объекта, посмотрите этот инструмент от IBM -> Структурный анализ для Java . Это действительно полезно для объектного анализа библиотек, API и т. Д.

9
ответ дан 18 December 2019 в 08:31
поделиться

Я не думаю, что вы можете измерить, как часто «нужен» класс или функция.
Есть несколько простых вопросов:

  • Что определяет, является ли статистика использования вашей игровой библиотеки «нормальной» или «выбросной»? Разве неправильно убивать себя в игре слишком часто? Вы бы чаще использовали класс killScreen как хороший геймер.
  • Что определяет «много»? Время или счет использования? POJO будут занимать редкое время, но используются довольно часто.

Заключение:
Я не знаю, чего вы пытаетесь достичь.
Если вы хотите отобразить зависимости кода, для этого есть другие инструменты . Если вы пытаетесь измерить выполнение кода, для Java есть профилировщик или тесты . Если вы фанат статистики, вы будете счастливы с RapidMiner ;)

Удачи с этим!

1
ответ дан 18 December 2019 в 08:31
поделиться

Не совсем то, что вы ищете, но:

Нечто подобное можно сделать с помощью инструментов покрытия кода (например, Cobertura ). Они не выполняют статическую проверку исходного кода, но используют байт-код для сбора метрик во время выполнения. Конечно, вам нужно управлять приложением так, чтобы оно использовало все шаблоны использования и могло пропустить более редкие пути кода.

Возможно, вам помогут эти инструменты в статическом анализе (проект Apache использует их для проверки совместимости API для В новых выпусках кажется, что эта задача в некоторой степени связана с тем, что вы пытаетесь сделать):

  • Clirr - это инструмент, который проверяет библиотеки Java на совместимость двоичных файлов и исходного кода с более старыми выпусками. По сути, вы предоставляете ему два набора jar-файлов, а Clirr выводит список изменений в общедоступном API.
  • JDiff - это доклет Javadoc, который генерирует HTML-отчет обо всех пакетах, классах, конструкторах, методах и полях, которые были удалены, добавлены или изменены любым способом, включая их документацию, при сравнении двух API ,
3
ответ дан 18 December 2019 в 08:31
поделиться

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/

1
ответ дан 18 December 2019 в 08:31
поделиться

Вот несколько списков инструментов покрытия кода Java. Я не использовал ни один из них лично, но это может помочь вам начать:

0
ответ дан 18 December 2019 в 08:31
поделиться

Использование клиентом отражающих вызовов - это одна дыра в статическом анализе, которую следует учитывать. Поскольку нет никакого способа узнать наверняка, что конкретный метод не вызывается через какую-то причудливую схему отражения. Так что, возможно, лучше всего подойдет комбинация времени выполнения и статического анализа.

3
ответ дан 18 December 2019 в 08:31
поделиться

Proguard также может быть опцией ( http://proguard.sourceforge.net/ ):

"Некоторые варианты использования ProGuard:

  • .. .
  • Список мертвого кода, чтобы его можно было удалить из исходного кода.
  • ... "

См. Также http://proguard.sourceforge.net/manual/examples.html#deadcode

0
ответ дан 18 December 2019 в 08:31
поделиться

IntelliJ имеет инструмент для обнаружения методов, полей и классов, которые могут иметь более ограниченные модификаторы. В нем также есть быстрое исправление для применения этих изменений, которое также может сэкономить вам много работы. Если вы не хотите платить за это, вы можете получить 30-дневную лицензию на пробную версию, которой более чем достаточно для изменения вашего кода, это не то, что вам нужно делать очень часто.

BTW: IntelliJ имеет около 650 проверок кода для улучшения качества кода, около половины из них содержат автоматические исправления, поэтому я предлагаю потратить пару дней на его использование для рефакторинга / наведения порядка в коде.

1
ответ дан 18 December 2019 в 08:31
поделиться

Обратите внимание на Детектор мертвого кода . Он утверждает, что делает именно то, что вы ищете: находит неиспользуемый код с помощью статического анализа.

1
ответ дан 18 December 2019 в 08:31
поделиться

Вы можете написать свою собственную утилиту для этого (в течение часа после прочтения этого), используя библиотеку анализа байт-кода ASM ( http://asm.ow2.org ). Вам нужно будет реализовать ClassVisitor и MethodVisitor. Вы будете использовать ClassReader для анализа файлов классов в вашей библиотеке.

  • Ваш метод visitMethod (..) вашего ClassVisitor будет вызываться для каждого объявленного метода.
  • Ваш visitMethodInsn (..) вашего MethodVisitor будет вызываться для каждого вызываемого метода

Держите карту для подсчета. Ключи представляют методы (см. Ниже). Вот какой-то код:

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());
    }
}

Наслаждайтесь!

0
ответ дан 18 December 2019 в 08:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: