从Java源代码获取所有使用的类名的列表

时间:2019-10-06 08:03:11

标签: java parsing javaparser

我正在寻找一个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加载的所有类,也不是在类路径中的类,而是通过解析未编译的原始Java源代码从文本意义上检测类的方法。

1 个答案:

答案 0 :(得分:0)

如果您只是在寻找强大的解析器,那么javaparser看起来就不错。

您可能想签出this question,解决方案是使用-verbose:class标志来查看JVM加载的所有类。那里的一个答案还提到对this 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代码的东西。只是一个想法,不确定是否会完美地工作。