You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何JUnit无需声明requires jdk.unsupported即可访问该模块?

JUnit与常规Java程序访问jdk.unsupported模块的行为差异解析

我想搞明白JUnit和常规Java程序在访问jdk.unsupported模块时的行为差异,我清楚不应使用该模块,只是想理解背后的运行机制。

常规Java程序的表现

我编写了如下程序:

public class UnsafeAttempt {
    public static void main(String[] args) {
        try {
            Class.forName("sun.reflect.ReflectionFactory");
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
    }
}

在模块路径上运行时,该程序会抛出java.lang.ClassNotFoundException,这符合我的预期。当我在module-info.java中添加requires jdk.unsupported;后,程序便能正常运行,这也在预期之内。

JUnit测试的异常表现

但将这段逻辑放在单元测试中时:

import org.junit.jupiter.api.Test;

public class UnsafeTest {
    @Test
    public void sunreflect() throws Exception {
        Class.forName("sun.reflect.ReflectionFactory");
    }
}

配合src/test/java下的这个module-info.java文件:

open module my.module {
    exports my.module;

    requires org.junit.jupiter.api;
}

即使未添加requires jdk.unsupported;,测试仍能正常运行,我对此感到困惑。

该行为在IntelliJ和Maven中均会出现,且我未对Maven Surefire插件做任何配置。

想知道JUnit、Surefire或其他组件做了什么,才导致这种情况?

编辑:已创建GitHub仓库用于复现该问题,方便大家测试。


内容的提问来源于stack exchange,提问作者jqno

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 16:02:45