当前位置: 首页 > 面试题库 >

有没有办法在运行时获取使用中的Guava版本?

欧阳楚
2023-03-14
问题内容

我快速浏览了Guava的源代码和文档,但似乎都没有提到版本。我想知道是否有一种方法可以在运行时获取Guava的版本信息。

如果实际上不存在此版本信息,则不必通过任何获取器进行访问。如果将其保存在某个字段中,而该字段在加载番石榴时没有得到GC,那么就足够了。

在运行时的任何地方都可以使用此版本信息吗?

我对此有非常具体的用途。我的工作很大一部分是分析Java堆转储,以识别并修复代码中导致内存使用过多的位置。对于此任务,我使用fasthat,它是经过严格修改的jhat版本,具有对我的工作有用的特殊功能。

这些功能之一是显示容器的内容。我已经实现了这个对于这样的人ArrayListHashMapConcurrentHashMap,等(我的需求实现类型的打印机,基于我在我们的堆转储遇到的问题。)目前,我执行番石榴的一个类型的打印机CustomConcurrentHashMap

由于结构的布局可以在版本之间改变,因此我的代码根据使用的版本来调整其拆包行为。例如,在工作中,我们曾经使用过JRuby 1.2,但是最近切换到了JRuby
1.6,因此我为这两个版本都使用了类型打印机,并且它根据在堆转储中找到的版本信息来选择版本。

因此,这就是问题第二段的要点:如果版本信息在堆转储中的任何位置,那就是我所需要的。

并且在任何人问之前:堆转储数据不是“活动的”,因此您不能简单地调用toString或类似方法。您实际上必须遍历数据结构以提取出位,并且您确实必须在第n级使用实现细节。;-)


问题答案:

这更多是一种解决方法,但是我想如果没有更简单的方法来访问Guava版本,您可以这样做:

在大多数Guava版本中,都添加/删除了类/字段/方法。您可以尝试在堆转储中查找它们,并根据它们的存在确定Guava版本。

就像是:

/**
 * A {@link Predicate} that checks whether a class exists in the given {@link HeapDump}
 */
public class ClassExistsPredicate implements Predicate<String> {

    private final HeapDump heapDump;

    public ClassExistsPredicate(HeapDump heapDump) {
        this.heapDump = heapDump;
    }

    @Override
    public boolean apply(String fullyQualifiedClassName) {
        // checks whether the given class exists in the heap dump
        return true;
    }

}


public enum GuavaVersion {

    R01,

    R02 {
        @Override
        Set<String> getAddedClasses() {
            return ImmutableSet.of("com.google.common.base.Foo");
        }
    },

    R03 {
        @Override
        Set<String> getAddedClasses() {
            return ImmutableSet.of("com.google.common.collect.ForwardingFooIterator");
        }
    },

    R04 {
        @Override
        Set<String> getAddedClasses() {
            return ImmutableSet.of("com.google.common.collect.FooFoo2");
        }
    };

    /**
     * @return a {@link Set} of added class names that uniquely identify this version from the preceding one (not
     *         necessarily <b>all</b> classes!)
     */
    Set<String> getAddedClasses() {
        return ImmutableSet.of();
    }

    public static GuavaVersion getGuavaVersionFor(HeapDump heapDump) {
        ClassExistsPredicate classExists = new ClassExistsPredicate(heapDump);

        for (GuavaVersion version : Lists.reverse(Arrays.asList(GuavaVersion.values()))) {
            if (Iterables.all(version.getAddedClasses(), classExists)) {
                return version;
            }
        }

        throw new RuntimeException("Unable to determine Guava version...");
    }

}

显然,您应该缓存Guava版本号,因为计算可能会很慢…该方法可以扩展为考虑添加的方法/字段。

这种方法也可以与其他项目一起使用。



 类似资料:
  • 问题内容: 在Java中,是否有一种方法(在运行时)获取定义了特定类的字节码? 换句话说,有没有一种方法可以获取在加载特定类时传递给数组的数组?我看到已经声明了此方法,因此似乎无法创建一个自定义类来拦截类定义。 过去,我曾使用该类通过该方法获取字节码,但我希望使用更规范的解决方案。 问题答案: 这是如何实现代理的说明

  • 问题内容: 有没有办法在nodejs应用中设置版本?我想要这样的东西 问题答案: 我发现以下代码片段最适合我。由于它用于加载,因此无论当前工作目录如何,它都可以工作。 @Pathogen提供的警告: 使用Browserify这样做会带来安全隐患。 注意不要将您的信息公开给客户端,因为这意味着您的所有依赖项版本号,构建和测试命令以及更多信息都将发送给客户端。 如果要在同一项目中构建服务器和客户端,则

  • 我们使用PHP7.0运行XAMPP是因为我们的新产品需要PHP7。 但是有些老项目使用等函数,这些函数在PHP7.0中被删除。 那么,有没有办法在XAMPP中轻松更改PHP版本呢? 注意:请不要建议将旧项目升级到与新版本兼容,因为我不能这样做,因为作为一个开发人员(只是一个员工),我不能得到这些决定。

  • 问题内容: 我们正在开发S60版本,该平台具有不错的Python API。 但是,关于Android上的Python尚无任何官方资料,但是由于Jython存在,有没有办法让蛇和机器人一起工作? 问题答案: 一种方法是使用: 开源Python库,用于快速开发利用创新用户界面的应用程序,例如多点触控应用程序。 可在和上运行。你可以在所有受支持的平台上运行相同的代码。

  • 问题内容: 因此,我使用Python 3.2.1的cElementTree解析了一些XML文件,并且在解析过程中,我注意到某些标签缺少属性信息。我想知道是否有任何简单的方法来获取xml文件中这些元素的行号。 问题答案: 查看文档,我看不到使用cElementTree做到这一点。 但是,我对lxml的XML实现版本感到幸运。使用libxml2,它的替换量几乎下降了。元素具有属性。(以及获得许多其他X

  • 问题内容: 我想从数据库中的表中获取列名列表。使用编译指示,我会得到一个元组列表,其中包含很多不需要的信息。有没有办法只获取列名?所以我最终可能会遇到这样的事情: [Column1,Column2,Column3,Column4] 之所以绝对需要此列表,是因为我想在列表中搜索列名并获取索引,因为很多代码中都使用了索引。 有没有办法得到这样的清单? 谢谢 问题答案: 您可以使用sqlite3和pep