模块化的使用1Java9模块(Modules)编程语言闲话编程Contents目标 .................................................................................................... 1模块化的使用 .......................................................................................... 1的模块如何创建一个模块Example:创建一个Java FX程序 ................................................................... 3中引入的最重要的特性是模块化。实现模块化是一件非常有挑战性的事情,在此之前,已经有过一些非官方的解决方案例如。实际在年的时候就提议要模块化,后面该提议又被取代并推延到,又推延到,最终直到年推迟后才发布出来。目标中阐述了模块化平台的关键目标:可靠的依赖配置:必须要能够通过模块化系统显式定义模块的依赖信息,能够在编译期和运行时都能够有效识别,并可以通过遍历所有模块的方式得到程序运行所需的所有模块信息。高度封装性:只有当模块中的包显式暴露、且被其他模块显式依赖的时候才能使用。对平台进行定制:可以对特定平台删除或者添加模块,从而实现平台的裁剪。隐藏平台细节:一些不希望暴露给用户的方法可以通过模块化隐藏起来。提高运行效率:在预知模块依赖的情况下,有一些优化可以提高性能。模块化的使用JDK的模块本身也拆分成了一系列的模块,可以通过命令列出来java --list-modules java.base@11.0.13java.compiler@11.0.13java.datatransfer@11.0.13java.desktop@11.0.13java.instrument@11.0.13java.logging@11.0.13java.management@11.0.13... 模块化的使用2如何创建一个模块创建模块十分简单,只需要添加一个特殊的文件,并添加模块的描述信息:module modulename { requires module.name;}requires用来申明模块依赖于其他模块requires static用来申明编译时依赖(运行时是可选的)requires transtive表示如果依赖某个模块,那么依赖的模块也隐式依赖exports导出包下的类型(包括嵌套的和类型)exports...to仅导出给指定的模块uses申明该模块为服务的消费者(使用了某接口或者抽象类)provides...with申明模块为服务提供者(提供了实现)opens申明包对于其他模块在运行时(包括反射)可见opens..to申明包对于特定的模块模块在运行时(包括反射)可见open申明模块下的所有包均在运行时可见module my.module { exports com.my.package.name;}module my.module { export com.my.package.name to com.specific.package;}module my.module { uses class.name;}module my.module { provides MyInterface with MyInterfaceImpl;}默认情况下,在模块中是不可见的(即使通过反射的方式),因此如果想暴露出来,可以通过open来实现。module foo { opens com.example.bar;}module my.module { opens com.my.package to moduleOne, moduleTwo, etc.;}open module foo {} Example:创建一个Java FX程序3Example:创建一个Java FX程序首先,需要通过插件来自动引入的依赖项plugins { id 'java' id 'application' id 'org.openjfx.javafxplugin' version '0.0.10'}javafx { version = "17.0.1" modules = [ 'javafx.controls' ]}然后,在中申明依赖关系module pulsar.browser { requires javafx.controls; exports com.riguz.pulsar.browser;}