是否可以"重置"类加载器?

 张逸紫惟雨 发布于 2023-02-08 12:37

我必须从一些JAR动态加载具有相同名称的类,但是多次执行不同的实现.

我正在创建一个评估器后端,我必须动态加载类并测试它们.

测试是JUnit类,它们实例化应该测试的类,这是一个简单的例子:

package evaluator.tests;

import static org.junit.Assert.*;

import org.junit.*;

import evaluator.tested.*;

public class KTest {
    private K tested;

    @Before
    public void setup() {
        tested = new K();
    }

    @Test
    public void returnsTrueTest() {
        assertTrue(tested.returnsTrue());
    }

}

我的应用程序的其余部分需要从用户接收JAR文件,这些文件将包含K上面正在测试的类的实现.然后,KTest必须运行他们的 K类,而不是应用程序中的类.

我知道如何动态加载一个类,但我不知道如何使用它进行测试,而不是我所做的那个.

我提出的解决方案之一是在一个全新的类中隔离测试,例如Evaluation,在该类中创建一个新的类加载器,并使其加载所有引用的类.在创建类加载器之后,它将K从JAR文件加载该类.

这意味着每次用户提交他的JAR时,Evaluation都会实例化一个单独的,它会创建自己的类加载器并启动JUnit测试.当发生这种情况时,测试将使用用户的实现K,而不是默认的实现.

这可能吗,怎么办呢?

我读到类加载器总是问他们的父是否已经加载了一个类.这意味着我必须以某种方式"刷新"我从JAR文件中动态加载的所有类Evaluation,以便它们将被卸载然后再次加载到另一个中Evaluation.

加载类K,测试类K,卸载类K,重复不同K.

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有