Получение списка всех используемых имен классов из исходного кода Java - PullRequest
2 голосов
/ 06 октября 2019

Я ищу библиотеку Java (синтаксический анализатор исходного кода), которая поможет мне извлечь неквалифицированные имена всех имен классов, используемых в исходном коде. Например, для данного примера кода:

public class Example {

    private ClassName1;

    protected ClassName2 instance = new ClassName2();

    public Example() {
        ClassName3 test = new ClassName3();
    }

    public doSomething() {
        //ClassName4 test = new ClassName4("SomeExampleString");
        ClassName5 test = new ClassName5("ExampleString2");
    }

}

Мне нужно получить следующий список:

ClassName1, ClassName2, ClassName3, ClassName5

, так как это список всех имен классовкоторые используются в исходном коде.

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

Итак, я ищу синтаксический анализатор исходного кода Java, который позволил бы мне получить списки имен классов, подобные приведенному в примере, и краткий пример того, как этого добиться или указания, где искать / как эта проблемаПравильно вызван.

ПРИМЕЧАНИЕ. Я не ищу метод для обнаружения всех классов, загруженных JVM, ни классов в classpath, а способ обнаружения классов в текстовом смысле путем анализа исходного исходного кода Java, который не скомпилирован.

1 Ответ

0 голосов
/ 06 октября 2019

Если вы просто ищете надежный парсер, похоже, что javaparser довольно хорошо.

Возможно, вы захотите проверить этот вопрос где решениечтобы просмотреть все классы, загруженные JVM, используя флаг -verbose:class. В одном из ответов также упоминается использование отражения (которое было моей первоначальной реакцией) с этим API .

Если этот вопрос не полностью решит вашу проблему (поскольку он покажет все загруженные классы, ""или нет", и вам не повезло с отражением, вы можете попробовать что-то вроде этого, которое объединит первое решение оттуда с моей идеей:

  • Используйте любой синтаксический анализатор для анализатокены в исходном коде
  • Используйте флаг -verbose:class при запуске какой-либо основной программы, которая создает экземпляр класса в файле, который вы хотите проверить
  • grep с любыми токенами, которые ваш синтаксический анализатор токенизировал из этого вывода

Итак, какая-то программа Main.java:

public class Main {
    public static void main(String[] args) {
        Example e = new Example();
    }
}

Ваш (или какой-то другой) парсер с основным методом (псевдокод):

tokens = parse_tokens()
print "\\\|".join(tokens)

И в bash:

javac *.java
TOKS="$(java MyParser Example.java)"
java -verbose:class Main | grep ${TOKS}

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

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