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

Netbeans12.5+Java16环境ModuleLayer.Controller动态权限配置失效问题

问题原因

你当前的权限配置完全没有作用,核心问题是模块实例的匹配错误:

  • 你直接从Consumer模块的主方法启动程序时,这个Consumer模块已经被JVM加载到了引导模块层(boot layer),和你代码里自定义的layer1层里的Consumer是两个完全独立的模块实例。
  • 你调用addReads、addOpens配置的是layer1层里两个模块的权限,但执行method.invoke的代码属于引导层的Consumer模块,自然不会生效。
  • 额外的冗余点:你把Consumer也加入了自定义层,属于多余操作,完全没有必要。

解决方案

调整代码逻辑,仅把需要动态控制权限的Test_Module_A放到自定义层,给引导层的Consumer模块配置对应权限即可,修改后的核心代码如下:

public static void main(String[] args)throws Exception
{
    Path baseDir=Path.of("C:/Users/Home/Documents/NetBeansProjects/Netbeans/Modular-Testing/build/modules/");
 
    // 仅加载Test_Module_A到自定义层,不需要加载Consumer
    Configuration level1=Configuration.resolve(
        ModuleFinder.of(baseDir.resolve("Test_Module_A")),
        List.of(ModuleLayer.boot().configuration()),
        ModuleFinder.of(),
        List.of("Test_Module_A")
    );   

    ModuleLayer.Controller layer1=ModuleLayer.defineModulesWithOneLoader(
        level1,
        List.of(ModuleLayer.boot()),
        ClassLoader.getSystemClassLoader()
    ); 
   
    // 获取当前执行代码所属的模块(引导层的Consumer模块)
    Module currentConsumerModule = CustomModuleTest.class.getModule();
    // 获取自定义层的Test_Module_A模块
    Module testModuleA = layer1.layer().findModule("Test_Module_A").get();
   
    // 给引导层的Consumer加读取Test_Module_A的权限
    layer1.addReads(testModuleA, currentConsumerModule);
    // 给引导层的Consumer开放Test_Module_A的package_a包
    layer1.addOpens(testModuleA, "package_a", currentConsumerModule);
   
    // 执行测试逻辑不变
    Class targetClass=layer1.layer().findLoader("Test_Module_A").loadClass("package_a.ClassA");
    Method method=targetClass.getDeclaredMethod("callMe");
    method.trySetAccessible();
    method.invoke(null);
}

修改后两个模块的module-info.java仍然可以保持为空,运行即可正常输出目标日志。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 21:06:03