【问题标题】:Force all classes in a certain directory to load using a custom class loader使用自定义类加载器强制加载某个目录中的所有类
【发布时间】:2013-12-06 12:17:07
【问题描述】:

我正在创建一个监视某个目录的服务,当它检测到该目录中的代码更改时,它会运行该目录中的所有测试。目的是它运行该目录中代码更改的测试。因此,如果我在一个类中添加一个新方法,然后再添加一个新测试,它应该使用新类和新测试并将其包含在其测试运行中。

我怎样才能动态地做到这一点?我可以通过扫描目录并收集测试并使用我自己的自定义动态加载器(由Reload used classes at runtime Java 完成)来动态加载所有测试类。但是课程仍然是更改之前的课程。在服务开始观看之前,即在运行时之前。

如何强制测试中使用的那些类也被动态加载?

【问题讨论】:

    标签: java dynamic reload


    【解决方案1】:

    在我看来,您希望在运行时更改类后重新加载它。你应该看看this article。这种方法的问题是,重新加载的类将不再相同,因为您不能两次使用相同的 ClassLoader 并且使用另一个类加载器将导致类不再相同并最终导致 ClassCastExceptions .

    这可以通过针对接口进行编程来避免,但您可能必须更改类设计。

    如果您还想重新加载所有引用的类,您可能需要覆盖ClassLoader.findClass(String name)。我现在无法测试这个非常具体的场景,但我假设所有引用的类都调用了这个方法。由于默认实现只会抛出一个ClassNotFoundException,父类加载器将被要求找到该类,它会给你旧版本。

    你可以试试这个:

    protected Class<?> findClass(String name) throws ClassNotFoundException {
       return loadClass(name);
    }
    

    【讨论】:

    • 我也用过这篇文章,但它并没有重新加载测试类中的类!我可以根据需要重新加载给定的类,但不能重新加载给定类使用的类。
    • @Sven 我稍微改变了答案。我目前无法自己测试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-09
    • 2012-05-01
    • 1970-01-01
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 2012-11-08
    相关资源
    最近更新 更多