Я быстро просмотрел исходный код и документацию Guava, и ни в одной из них, похоже, нет упоминаний о версиях. Мне было интересно, есть ли способ получить информацию о версии Guava во время выполнения.
Эта информация о версии не обязательно должна быть доступна через какой-либо геттер, если такой вещи на самом деле не существует; если он спрятан где-нибудь в поле, которое не получает GC при загрузке Guava, этого будет достаточно.
Доступна ли эта информация о версии где-нибудь во время выполнения?
У меня есть очень конкретное применение для этого. Большая часть моей работы - это анализ дампов кучи Java для выявления и исправления мест в коде, которые вызывают чрезмерное использование памяти. Для этой задачи я использую fasthat , сильно модифицированную версию jhat со специальными функциями, полезными для моей работы.
Одной из этих функций является отображение содержимого контейнеров. Я уже реализовал это для подобных ArrayList
, HashMap
, ConcurrentHashMap
и т.д. наши дампы кучи.) В настоящее время я реализую типовой принтер для Guava CustomConcurrentHashMap
.
Поскольку расположение структур может меняться от версии к версии, мой код настраивает свое поведение при распаковке в зависимости от того, какая версия используется.Например, на работе мы использовали JRuby 1.2, но недавно перешли на JRuby 1.6, поэтому у меня есть принтеры типов для обеих этих версий, и он выбирает версию на основе информации о версии, которую он находит в дампе кучи.
Итак, в этом суть второго абзаца вопроса: если информация о версии находится где-нибудь в дампе кучи, это все, что мне нужно.
И прежде чем кто-либо спросит: данные дампа кучи не являются «живыми», поэтому вы не можете просто вызвать toString
или что-то подобное. Вам действительно нужно пройтись по структурам данных, чтобы извлечь биты, и вам действительно нужно использовать детали реализации в энной степени. ; -)