龙空技术网

体验JDK9新特性:模块

摆技 218

前言:

现在同学们对“javajdk9”大致比较重视,咱们都想要学习一些“javajdk9”的相关文章。那么小编也在网摘上网罗了一些关于“javajdk9””的相关内容,希望看官们能喜欢,各位老铁们一起来了解一下吧!

概述

JDK9发布以来,JAVA添加了一个重要的新功能,称为“模块”。模块提供了一种描述组成应用程序的代码的关系和以来层次的方式。模块还允许控制其中的哪些部分可以访问其他模块,哪些不能访问其它模块。使用模块可以创建更可靠、更具伸缩性的应用。

一般而言,模块对大型应用程序有很大的好处,因为模块可以降低与大型系统相关的管理复杂性。但是小规模的程序也能得益于模块,因为JDK的API现在组织到模块中。因此,如今的JAVA程序可以指定需要那部分的API,不需要哪部分的API。这项改变有助于计算机以更短的运行时间部署程序。

对模块的支持通过语言元素来提供,包括新关键字,以及对javac、java和其他JDK工具的改进,而且引入了新工具和文件格式。简单地说,模块是JAVA9的一个新特性。

模块基础

在最基本的意义上,模块可以通过模块名统一指代的包和资源的一种组合。模块声明指定了模块的名称,定义了模块及其包与其他模块的关系。模块声明是JAVA源文件中的语句。通过与之相关的几个关键字来支持:

exports、module、open、opens、provides、requires、to、transitive、uses、with

注意,这些关键字尽在模块声明的时候才会被看成关键字,在其他情况下,都会被解释为标识符。这样的设计,可以防止已有的旧代码把这些用于标识符时出现的兼容性问题。例如,假如在JDK9之前的某个程序中使用requires作为变量名。将改程序移植到JDK9之后,如果requires在模块外被识别为关键字,这段代码就会出现编译错误。尽在模块中将requires看做关键字可以有效的防止这一点,因此关键字requires也可以用作变量名,只是这种用法不推荐而已。

模块声明包含在module-info.java文件中。因此,模块在JAVA源文件中定义。这个文件由javac编译到一个类文件中,称为模块描述符。module-info.java文件只能包含一个模块定义,不是通用文件。模块声明以关键字module开头,一般形式如下:

module myModule {}

其中,myModule是模块名,必须是java有效的标识符。

牛刀小试

1)创建目录moduleapp,这是应用的顶级目录。

2)在moduleapp下创建目录appsrc,这是存放源代码的。

3)在appsrc下创建目录appstart。在这个子目录下在创建子目录appstart,在这个子目录下在创建appdemo,因此,从appsrc开始创建了如下结构:

appsrc\appstart\appstart\appdemo

4)在appsrc下创建appfuncs。在这个子目录下在创建appfuncs,在这个子目录下创建simplefuncs,因此,从appsrc开始创建了如下结构:

appsrc\appfuncs\appfuncs\simplefuncs

5)整个建好的目录结构如图:

6)在appfuncs\simplefuncs目录下,写一个SimpleMathFuncs.java:

package appfuncs.simplefuncs; /** * @author 摆技 */public class SimpleMathFuncs {   //b能否被a整除 public static boolean isFactor(int a, int b) {  if((b%a) == 0) return true;  return false;  }   //返回a和b的最小公因数 public static int lcf(int a, int b) { a = Math.abs(a);  b = Math.abs(b);  int min = a < b ? a : b; 	 for(int i = 2; i <= min/2; i++) {  if(isFactor(i, a) && isFactor(i, b)){		return i;	 } } return 1;  }   //返回a和b的最大公因数 public static int gcf(int a, int b) { a = Math.abs(a);  b = Math.abs(b);  int min = a < b ? a : b;   for(int i = min/2; i >= 2; i--) {  if(isFactor(i, a) && isFactor(i, b))  return i;  }   return 1;  } }

7)在appstart\appdemo下写一个ModuleAppDemo.java,导入了SimpleMathFuncs类,使用了SimpleMathFuncs中的方法。

package appstart.appdemo;  import appfuncs.simplefuncs.SimpleMathFuncs; /** * @author 摆技 */public class ModuleAppDemo {  public static void main(String[] args) {   if(SimpleMathFuncs.isFactor(2, 10)){		System.out.println("2是10的因数"); 	}  System.out.println("35和105的最小公因数是:" + SimpleMathFuncs.lcf(35, 105));  System.out.println("35和105的最大公因数是:" + SimpleMathFuncs.gcf(35, 105));  } }

8)在appsrc\appfuncs下添加aapfuncs模块文件module-info.java:

module appfuncs {  exports appfuncs.simplefuncs; }

9)在appsrc\appstart下添加模块文件module-info.java:

module appstart {  requires appfuncs; }
编译程序

JDK9开始支持模块,因此与其他JAVA程序一样,基于模块的程序也可以使用javac编译。不过我们需要给编译器指定模块路径,而且确保在moduleapp目录下执行javac命令。

1)使用如下命令编译SimpleMathFuncs.java文件:

javac -d appmodules/appfuncs appsrc/appfuncs/appfuncs/simplefuncs/SimpleMathFuncs.java

2)使用如下命令编译appfuncs模块:

javac -d appmodules/appfuncs appsrc/appfuncs/module-info.java

3)以上两步可以并为一步:

javac -d appmodules/appfuncs appsrc/appfuncs/module-info.java 	appsrc/appfuncs/appfuncs/simplefuncs/SimpleMathFuncs.java

4)现在使用一个命令编译appstart模块和ModuleAppDemo.java文件

javac --module-path appmodules -d appmodules/appfuncs 	appsrc/appstart/module-info.java 	appsrc/appstart/appstart/appdemo/ModuleAppDemo.java
运行程序

使用如下命令运行改程序:

javac --module-path appmodules -m appsrc/appstart.appdemo.ModuleAppDemo

得到如下结果:

2是10的因数35和105的最小公因数是:535和105的最大公因数是:7

如果大家有兴趣,我会继续更新模块的相关内容!

标签: #javajdk9