【问题标题】:Obtaining a list of all used class names from a Java source code从 Java 源代码中获取所有使用的类名的列表
【发布时间】:2019-10-06 08:03:11
【问题描述】:

我正在寻找一个 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 源代码来检测文本意义上的类的方法。

【问题讨论】:

    标签: java parsing javaparser


    【解决方案1】:

    如果你只是在寻找一个健壮的解析器,看起来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 代码的东西。只是一个想法,不确定这是否会完美。

    【讨论】:

    • 我正在寻找一种无需编译代码就能做到这一点的方法,因此 Java 解析器可以返回源代码中引用的类名列表。现在我有自己的解析器“标记化”代码并为您的 Main.java 文件示例返回诸如 [Example, String] 之类的值,但也返回诸如 [e, main, args, public, class, ...] 之类的东西,所以我正在寻找一个合适的 Java 解析器,它可以只返回实际的类名,而不是成员名、方法名、变量名和其他元素。
    猜你喜欢
    • 2011-03-12
    • 2018-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多