繁体   English   中英

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

[英]How can I resolve the type of identifiers when parsing Java source?

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

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

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

由于反射,这无法完美解决,但我希望一个好的解析器至少可以处理范围和强制转换问题。

编辑:我不能假设其他源文件会存在,所以我不能简单地跟随方法调用到它的源并从方法声明中读取签名

Java 的 Pluggable Annotation Processing Framework(及其 相关 API )设计为 model Java 代码在您所说的方式。 您可以在运行时调用 Java 编译器,从而使用 javax.lang.model 包中的 API 访问源代码的javax.lang.model 介绍性文章可在此处获得。

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

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

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

但是除了编译 java 之外,您可能还有其他目标; 一旦你有了这些名字,你就想对它们做点什么。 Java 编译器在这里不太可能为您提供帮助。

您真正需要的是构建处理 Java 语言(包括名称和类型解析)的工具的基础,这将帮助您完成任务的 rest。

我们的DMS 软件再造工具包是通用的程序分析和转换机器。 它解析代码、构建 AST、管理符号表、提供通用流分析机制、在程序上和表面语法模式方面支持 AST 修改(或构造),包括从 AST(包括任何注释)(重新)生成可编译文本。

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

作为一个实际问题,如果没有 Java 源文件(或相应的 class 文件)的 rest,您将无法做到完整、准确的名称和类型解析,无论您如何处理它。 您可能能够产生一些启发式猜测,但仅此而已。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM