gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:02:47 28 4
gpt4 key购买 nike

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

最佳答案

如果你只是在寻找一个健壮的解析器,看起来像javaparser还不错。

您可能想查看 this question解决方案是使用 -verbose:class 标志查看 JVM 加载的所有类。那里的一个答案还提到对 this API 使用反射(这是我最初的 react ) .

如果该问题不能完全解决您的问题(因为它会显示所有已加载、“已使用”或未加载的类),并且您没有任何反射运气,您可以尝试结合第一个的类似方法根据我的想法从那里解决:

  • 使用您拥有的任何解析器来解析源代码中的标记
  • 在运行一些主程序时使用 -verbose:class 标志来实例化您要检查的文件中的类
  • grep 解析器从该输出中标记化的任何标记

所以,一些程序 Main.java:

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

您的(或其他一些)带有 main 方法(伪代码)的解析器:

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

在 bash 中:

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

这样一来,您就不需要强大的解析器,只需要对 Java 代码进行标记即可。只是一个想法,不确定这是否会完美。

关于java - 从 Java 源代码中获取所有使用过的类名的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58255342/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com