解析Java源代码时如何解析标识符的类型?

时间:2011-06-29 21:08:33

标签: java parsing

我正在解析Java源文件,我需要提取类型信息来猜测被调用方法的签名。

e.g。我有foo.x(bar),我需要弄清楚foo和bar的类型。

我正在使用一个java解析器,它给了我一个完整的AST,但我遇到了范围问题。我可以使用不同的解析器来解决这个问题吗?

由于反射这无法完美解决,但我希望一个好的解析器能够处理范围和投射问题。

编辑:我不能假设其他源文件会出现,所以我不能简单地按照方法调用它的来源并从方法声明中读取签名

3 个答案:

答案 0 :(得分:2)

Java的可插入注释处理框架(及其associated APIs)旨在以您所谈论的方式对Java代码进行建模。您可以在运行时调用Java编译器,使您可以使用javax.lang.model包中的API访问源模型。有一篇介绍性文章here

答案 1 :(得分:1)

基本上获取标识符类型需要您自己运行Java编译器的大部分内容。在Java中,从解析到解析类型还有很长的路要走,因此即使对于优秀的程序员来说,实现这一点也是一项具有挑战性的任务。

也许你最好的方法是从OpenJDK中获取Java编译器,运行相关的编译器阶段并从中提取类型。

答案 2 :(得分:1)

您需要的是所有名称和类型解析机制。正如另一张海报所观察到的,你可以通过一种方式滥用Java编译器。

但除了编译java之外,你可能还有一些目标;一旦你有了这些名字,你就想要一些东西。 Java编译器不太可能在这里帮助你。

您真正想要的是构建处理Java语言的工具的基础,包括名称和类型解析,这将有助于您完成剩余的任务。

我们的DMS Software Reengineering Toolkit是广义的程序分析和转换机制。它解析代码,构建AST,管理符号表,提供通用流分析机制,在程序上和表面语法模式方面支持AST修改(或构造),包括(重新)生成来自AST的可编译文本,包括任何注释。 / p>

DMS有一个Java Front End,它使DMS能够处理Java,构建Java AST,完成所需的所有名称和类型解析。是的,这是很多机器,相当于Java编译器所具有的,请阅读最新的Java参考手册。您可以在该基础之上构建所需的任何自定义工具。

无论您如何处理它,您在实际问题上所能做的就是完整,准确的名称和类型解析,而不需要其他Java源文件(或相应的类文件)。你可能能够产生一些启发式猜测,但这就是全部。