【发布时间】:2011-10-08 02:49:27
【问题描述】:
我对 Guava 源代码和文档进行了快速 grep,但似乎都没有提及版本。我想知道是否有一种方法可以在运行时获取 Guava 的版本信息。
如果实际上不存在这样的东西,则不必通过任何 getter 访问此版本信息;如果它藏在某个字段中,而在加载 Guava 时不会被 GC 处理,那就足够了。
此版本信息在运行时是否可用?
我对此有一个非常具体的用途。我工作的很大一部分是分析 Java 堆转储,以识别和修复代码中导致过度使用内存的地方。对于这项任务,我使用fasthat,这是jhat 的一个经过大量修改的版本,具有对我的工作有用的特殊功能。
其中一项功能是显示容器的内容。我已经为ArrayList、HashMap、ConcurrentHashMap 等实现了这个(根据我在堆转储中遇到的情况,我按需实现了类型打印机。)目前,我正在实现一个Guava 的CustomConcurrentHashMap 的类型打印机。
由于结构的布局可以在版本之间发生变化,我的代码会根据正在使用的版本调整其解包行为。例如,在工作中,我们曾经使用 JRuby 1.2,但最近切换到 JRuby 1.6,所以我为这两个版本都有类型打印机,它会根据在堆转储中找到的版本信息来选择版本。
所以,这就是问题第二段的重点:如果版本信息在堆转储中的任何位置,这就是我所需要的。
在有人问之前:堆转储数据不是“实时”的,所以你不能简单地调用toString 或类似的方法。您确实必须遍历数据结构才能提取位,并且您确实必须使用第 n 级的实现细节。 ;-)
【问题讨论】: