Вопрос

Я работаю над библиотекой, где мы хотим определить, какая часть нашей библиотеки используется.Т.Е.мы хотим знать, сколько методов в нашей библиотеке являются общедоступными, но никогда не вызываются.

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

Это было полезно?

Решение

Я верю, что вы ищете этот плагин eclipse -> UCDetector ( Детектор UCD )

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

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

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

Другие советы

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

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

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

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

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

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

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

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

Удачи вам в этом!

Я бы предположил, что JDepend показывает вам зависимости между пакетами и классами, отлично подходит для поиска циклических зависимостей!http://clarkware.com/software/JDepend.html (у него есть плагин eclipse: http://andrei.gmxhome.de/jdepend4eclipse/

а также PMD для других показателей http://pmd.sourceforge.net/

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

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

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

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

Proguard тоже может быть вариантом (http://proguard.sourceforge.net/):

"Некоторые области применения ProGuard заключаются в следующем:

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

Смотрите также http://proguard.sourceforge.net/manual/examples.html#deadcode

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

  • visitMethod вашего ClassVisitor(..) будет вызываться для каждого объявленного метода.
  • Visitmethod Innsn(..) вашего 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());
    }
}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top