1. 简介
Java 9中引入了模块系统,这是一项旨在使Java应用程序开发更具可扩展性、更安全、更灵活的重大变革。在Java 9之前,Java应用程序是以不透明的、类路径为基础的方式被加载和连接的,这对于大型应用程序来说是不够灵活和强大的。Java 9的模块系统试图解决这些问题,以便更好地支持大型Java应用程序的开发和维护。
2. 为什么需要模块系统?
Java 9的模块系统旨在改善Java应用的可靠性、安全性和可维护性。在Java 9之前,开发者可以使用类路径将Java应用程序中的源代码、二进制文件和其他库放在一起,并将其编译为JAR文件。这种方法虽然简单,但并不适用于大型应用程序。在一个大型Java应用程序中,可能有数千个源代码和二进制文件,这些文件可能分布在几十个甚至几百个JAR文件中,这会导致以下问题:
2.1 可靠性问题
在一个基于类路径的应用程序中,可能会出现类路径冲突的问题。如果两个或多个不同的库使用相同的包名和类名,那么在应用程序中使用这些库时,就会出现问题。这个问题可以通过将每个库放在不同的命名空间中来解决,但这又引入了另一个问题,即在运行时如何解决这些命名冲突。这个问题极大地影响了可靠性和代码复用性。
2.2 安全性问题
在一个基于类路径的应用程序中,一个库可以访问应用程序中其他库的所有类和数据。这可能会导致安全性问题。如果一个恶意的库被插入到应用程序中,它可以访问应用程序中的其他库的所有类和数据。这种情况在通过网络或其他方式分发的应用中尤其危险。
2.3 可维护性问题
在一个基于类路径的应用程序中,开发者需要手动维护类路径的顺序和依赖关系,这对于大型应用程序来说是一个大问题。如果一个库被删除或者升级了,开发者需要手动更新类路径,这会增加出错的风险。
Java 9的模块系统被设计用来解决这些问题,它提供了更好的封装,更精细的依赖关系管理,更好的可读性和可维护性,更好的代码复用,更好的安全性。
3. 模块系统的基本概念
在Java 9的模块系统中,有以下基本概念:
3.1 模块(Module)
模块是Java代码的一个组成单元,定义了要导出的功能和导入的依赖项。一个模块可以包含一个或多个包,一个模块中的所有包都可以被一个或多个其他模块所访问。
一个模块包含了以下元素:
模块名称(Module name)
模块描述文件(Module descriptor)
源代码
其他资源文件
3.2 导出(Export)
导出是指一个模块将其包或者模块中的某些包提供给其他模块使用的过程。导出的包可以被其它模块使用,但不能被直接访问。
导出包的语法如下:
exports com.example.mypackage;
上述语法表示将com.example.mypackage包导出。
3.3 隐藏(Hide)
隐藏是指一个模块将其包或者模块中的某些包只提供给其自身的代码使用的过程。隐藏的包不能被其他模块使用。隐藏的包可以在升级模块时提供一些保护。
隐藏包的语法如下:
hides com.example.mypackage;
上述语法表示将com.example.mypackage包隐藏。
3.4 开放(Open)
开放是指一个模块将其包或者模块中的某些包提供给所有代码访问的过程。开放的包可以和反射一起使用。
开放包的语法如下:
opens com.example.mypackage;
上述语法表示将com.example.mypackage包开放。
3.5 使用(Require)
使用是指一个模块声明其需要其他模块的某些包或者所有内容。使用包的代码可以使用其模块声明需要的所有内容。
使用模块的语法如下:
requires com.example.mymodule;
上述语法表示需要com.example.mymodule模块。
3.6 自动模块(Automatic module)
自动模块是指没有module-info.java文件的JAR文件或目录,Java 9将根据这些JAR文件或目录中的类来创建一个自动模块。自动模块会自动导出所有包,使用所有模块。
4. 总结
Java 9的模块系统是Java应用程序开发中的一项重大变革,它试图解决由基于类路径的应用程序引起的可靠性、安全性和可维护性问题。模块系统引入了多个概念,如模块、导出、隐藏、开放和使用,从而使Java应用程序更具可扩展性、更安全、更灵活。模块系统是Java应用程序未来发展的重要一步,将会在未来的Java版本中得到更好的发展和完善。