【问题标题】:Java Language StatisticsJava 语言统计
【发布时间】:2014-12-18 16:01:59
【问题描述】:

我有兴趣收集一些关于我可以访问的大型 Java 代码语料库的统计数据。我感兴趣的一些统计数据可能包括使用某些方法/类的频率、导入某些包的频率等等。

我的第一个想法是使用javaparser,但该库仅支持 Java 1.5,而且我拥有的大部分代码都是 1.6 或更高版本。

是否有一个库可以通过一些 Java 代码为我提供准确的 AST(即,我可以向 javac 询问它吗?),或者有没有更好的方法来解决这个问题(也许检查字节码)?

【问题讨论】:

  • 我会深入研究 pmd 的how it works,看看您是否可以根据您的需求调整它。也就是说,这不是你想的小事。
  • 我不知道如何解决这个问题,但你会得到我的一颗星,因为我很想知道你想出了什么。如果您确实找到答案,请将其作为答案发布!它会帮助互联网上的很多人,就像你在寻找解决方案一样!
  • @DreadHeadedDeveloper 我一定会在我弄明白的时候回帖。要是这能像在 Haskell 中一样简单就好了……(感谢 haskell-src-exts!)
  • 你的问题“使用某种方法的频率是多少”等于问“有多少地方调用这种方法?”。为此,您需要一个 Java 调用图。看我的回答:stackoverflow.com/a/26519597/120163
  • 这个链接怎么样programcreek.com/2012/04/…

标签: java parsing


【解决方案1】:

不知道准确的 AST,但您当然可以使用 ASM 或 BCEL 之类的包读取字节码,并且扫描这些数据结构以查找函数调用将相当简单。当然这可能是在进行了一些早期的优化之后,所以它可能不会直接反映源......而且它在JIT之前,所以它可能不会直接反映实际运行的内容。

另一种解决方案是在分析器的控制下运行代码,这可以为您提供从不同位置调用的相对或绝对频率。

这些都不会为您提供导入的数量——这纯粹是句法细节。但出于同样的原因,我认为这实际上不是一个有意义的数字。

【讨论】:

  • 这种方法可能会比较容易找到调用站点。问题的难点在于确定调用站点调用了哪些特定的目标方法?为此,您需要一个调用图。是的,构建调用图的原始信息在 ASM 或 BCEL 中(就像在源代码中一样)。提取它并不容易,因为您需要先或同时进行指向分析。
  • 对于调用模式,一个好的分析器可能是你最好的选择——因为你在手动分析代码期间的假设可能与条件运行在真实世界代码和子类化时实际发生的情况不匹配可能会引入您没想到的层/替代方案。
猜你喜欢
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
  • 2021-04-22
  • 2011-06-27
  • 2021-05-28
  • 2011-01-13
  • 2019-10-31
  • 1970-01-01
相关资源
最近更新 更多