建议参考:https://www.journaldev.com/13106/java-9-modules
JDK 9 进行了一次重大的升级引入了模块化系统。其目的是:能够实现模块化的关键目标——可配置的封装隔离机制。
模块化解决了什么问题?
减少环境资源的开销和降耦合度:在JDK 9之前每次启动JVM都要耗费至少 30MB~60MB的内存空间,其主要原因是JVM需要加载rt.jar,不管是否用到其中的类是否被加载,第一步就是要将整个rt.jar加载到内存中去,这样极大的浪费了内存空间,而JDK 9开始就可以选择性的模块进行加载。
提升开发效率和运行速度:由于代码库越来越复杂会导致,开发的效率降低和运行速度变慢。
规范化各种路径及依赖关系使系统更安全:jdk9之前系统没有对不同jar之间的依赖或敏感路径进行限制,导致所有的jar都是可以被访问到无形中暴露安全性的问题,jdk9后使用模块来管理各个模块使用的模块可以进入引用,不使用的则进行隐藏,这样即安全又减省空间。
模块化后的路劲访问规则?
JAR文件在类路径的访问规则?
所有类下JAR文件和其他资源文件,会被自动打包到匿名模块(Unnamed Module),这个模块没有任何隔离。
JAR文件在模块路径的访问规则?
自动模块将默认依赖整个模块路径中的所有模块,可以访问所有模块的包,也可以导出自己所有包。
模块在模块路径的访问规则?
模块路径下具名模块(Named Module)只能访问明确定义的依赖和模块包。
模块化后的类加载器
模块后的类加载器在双亲委派机制上进行调整:
原有的拓展类加载器被平台类加载器所取代;
平台类加载器和应用程序类加载器都不再继承自java.net.URLClassLoader,而是全部继承来自 jdk.internal.loader.BuiltinClassLoader。
原来的类双亲委派机制也发现了改变,当平台及应用类加载器接收到请求,再委派给父类之前,先判断该类是否能够归属于某一个系统模块中,如果可以找到这样的归属关系,就先委派给这个模块的类加载器完成加载,这样算是第四次打破双亲委派机制了。
最后
当然JDK9功能很新颖,类加载机制的改变及模块后可以节省我们大量的内存空间,并且在加载外部jar包未成功的时候可以很明显的提示,也一定上起到解耦作用,可惜国内目前的JDK 还是8的版本,所以功能再好目前各大厂也没有推进,所以只能先自学,以待将来某些必要条件发生推动使用。
参考文章:
https://www.journaldev.com/13106/java-9-modules
https://www.cnblogs.com/IcanFixIt/p/6947763.html
https://blog.csdn.net/weixin_40391011/article/details/104057515
https://www.ktanx.com/blog/p/3722
https://www.pianshen.com/article/16291271764/
https://blog.csdn.net/weixin_40391011/article/details/104057515