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
相关产品推荐
相关产品推荐

