疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

理解模块化系统Java 9模块化系统连载之一


 

   

  面世已经20多年的Java,已经发展成为一门影响深远的编程语言,无数平台、系统都采用Java语言编写。但Java也越来越庞大,逐渐发展成一头“臃肿”的大象:无论是运行一个大型的系统平台,还是运行一个小小的工具软件,JVM总要加载整个Java运行时环境,其中位于JDK安装目录下jrelib下的rt.jar就达到60多M,而位于JDK安装目录下lib目录下的tools.jar也达到17.3M。即使程序只需要使用Java的部分核心功能,JVM也需要完整地加载数百M的JRE环境。

  为了给Java“瘦身”,让Java实现轻量化,Java 9正式推出了模块化(项目代号为Jigsaw),Java正式被拆分成N个模块,并允许Java程序可以根据需要选择只加载程序必需的Java模块,这样就可以让Java以轻量化的方式来运行。

  提示:Java 7已经提出了模块化概念,但由于其过于复杂,Java 7、Java 8一直未能真正推出。Java 模块化直到Java 9才真正成熟。

  对于Java而言,模块化系统是一次真正的自我革新,这种革新使“古老而庞大”的Java语言重新焕发年轻的活力。

  a.1 理解模块化系统

  在Java 9之前,一个Java程序通常会以N个包的形式进行组织,每个包下可包含个Java类型(类、接口、枚举和注解),这种程序组织结构本身就存在以下问题。

  q 包只是充当命名空间的角色,包中的公共类型可以在所有其他包中访问;包并没有真正充当访问权限的界定边界。

  q Java程序运行时只能看到程序加载系列JAR包,无法真正确定不同JAR包中是否包含多个相同类型的不同副本,而Java程序运行默认加载类路径中遇到第一个JAR包所包含的Java类型。

  q Java程序运行时经常由于缺失某个JAR包所导致的ClassNotFoundException。有时候也会因为包含错误的JAR版本而导致运行时错误。

  另外,庞大而臃肿的JRE库也是一个问题,无论你运行的Java软件多么小,系统总需要下载、启动整个JRE,这样增加了系统开销,降低了程序运行性能。

  Java 9的模块化系统致力于解决以上问题,模块系统从两方面进行规范:

  q 模块化系统将整个JDK、JRE本身分解成多个相对独立的模块,这样应用程序可根据需要只加载必须的模块。

  q 应用程序、框架、库本身可以被分解成相对独立的模块,模块与模块相对独立,而且模块可作为访问权限的界定边界。

  每个模块都有如图19.1所示的结构。

  图19.1 模块的结构

  从图19.1可以看出,模块是一个比“包”更大的程序单元,一个模块可以包含多个包,而每个包下又可包含N个Java类型(类、接口、枚举和注解)。

  此外,模块也可作为访问权限的界定边界,模块可通过模块描述文件指定哪些包需要被暴露出来、哪些包需要被隐藏。对于被隐藏的包,即使它所包含的Java类型使用了public修饰,这些Java类型依然不能被其他模块访问。

     【阅读原文】