4

给定特定类源代码(Java/C#)的行号 - 是否有一种简单的方法来获取它所属的方法的名称?(如果它在一个范围内)(大概使用抽象语法树)

(这对于将 checkstyle 的输出限制为仅触及的方法很有用)。

我假设您必须使用抽象语法树来执行 Line#-> MethodName。

4

3 回答 3

2

我不了解 Java,但 .NET 程序集的元数据表中没有存储行号 - 您需要一个 PDB(程序数据库)文件来获取此类信息。

于 2009-06-22T12:18:25.473 回答
2

(特定于 Java)

如果类文件是使用调试信息编译的,那么行号表将包含代码<->行号的映射。我不认为有一个内置的 API 可以在运行时获取这个,但我相信你可能可以使用一些字节码工程库,比如 ASM 或 BCEL。

于 2009-06-22T12:29:51.720 回答
0

是的,正如你所说,使用正确的 AST。DMS Software Reengineering Toolkit可以为 Java 和 C# 构建 AST 。每个 AST 节点都用行号数据装饰。每个 AST 节点对应一个语法规则。

所以确定行号的方法名的问题很简单:在 AST 中找到一个对应行号的节点,然后爬树,直到找到代表方法声明的 AST 节点;从该节点中找到方法名称子树并将其打印出来。

这个技巧在使用 DMS 构建的静态分析工具中大量使用,以报告在特定行号诊断的问题的违规方法名称。DMS 旨在使其他人能够构建此类静态分析工具。

于 2009-08-19T07:42:50.193 回答