java9原定2017年3月推出,由于模块化有问题延迟到7月份,后来又推迟到9月份。万众期待的java9由于模块化的问题一再推迟,让我们来看一下什么是java9的模块化(代号Jigsaw)。

环境准备

jdk9抢先版下载,最新版的Intellij(2017.2)已经支持java9的模块化。

什么是模块化

将一个或者多个java文件封装起来,并且提供唯一的一个接口公布出去(module-info)。

一个模块的格式如下:

java9-module.png

由一个或多个package和一个module-info组成。这样就创建了一个简单的模块,module-info用是访问该模块的唯一入口。

module-info

每一个模块都必须在根目录下面有一个名为module-info的java文件。该模块的信息将在module-info中定义。

eq:

module model {

exports test;

}

我定义了一个名为model的模块,提供了包名为test的包(外部可以通过module-info引入该模块,就可以访问到test包下的所有java文件)。

module-info中的一些常用关键字:

module 模块标记,类似class,interface这些后跟模块的名称。

exports 用来定义对外公布的package,后面跟包名,可以提供多个。

requires 用来定义当前模块需要依赖的模块,后跟模块名。

uses 指定使用接口。

opens 指定包下的所有java文件对外开放可以通过反射调。

open 作用于module上当前模块所有公布(exports)出去的包下面的java文件都可以通过反射调用。

transitive 作用于requires将当前依赖的模块传递性暴露出去。

举个栗子

//common模块

module common {

//对外公开utils包下的所有java文件

exports utils;

}

//model模块

module model {

//对外公开entity包下的所有java文件

exports entity;

//对外公开entity包下的所有java文件

exports vos;

//依赖common模块,并且传递到外部。

requires transitive common;

}

//service模块

module service {

//依赖model模块,由于model中已经显示的声明将common传递出来。

//所以不需要再声明依赖common就可以在service中调用utils包下的java文件。

requires model;

}

上面定义了三个模块。依赖关系为common为最底层模块,model为中间层,service为上层模块。如果一个模块比较复杂,根目录下有多个子package,需要公开多个package下的java文件可以显示的声明多个exports。exports还可以显示的指定发布到具体哪些模块中,语法如下:exports to ,,...

小结

java9去除了传统的jar引入方式,使用模块化声明式引入(我刚开始研究的时候,用的老版本的Intellij然后引入jdk9之后找不到基础jar包,编译器报找不到class错误,如果用命令行就不会出问题,这也算是刚开始研究java9的一个小坑吧)。模块化的特性:

声明式依赖通过声明式的引入方式,降低了传统jar包引入的耦合关系,有点像maven的dependency(模块化没有版本的概念)。

增强封装自定义封装内部实现,只需要暴露外部访问的接口类即可。具体实现外面不需要知道也访问不了(隐藏实现)。

这样在运行一些简单的demo的时候就可以节省很多空间,不需要像以前一样,把所有的jar都加载进来。这样显示的声明,需要什么引什么使java更轻量级,更方便开发。

java module和model_Java9-Modularity 初探相关推荐

  1. Java 9 模块化(Modularity)

    JDK9的发布一直在推迟,终于在2017年9月21日发布了.下面是JDK9的几个下载地址:  JDK9.0.1 Windows-x64下载地址  Oracle Java 官网下载地址  OpenJDK ...

  2. java游侠_Java Lambda表达式初探

    Java Lambda表达式初探 前言 Java 8已经发行两年多,但很多人仍然在使用JDK7.对企业来说,技术上谨慎未必是坏事,但对个人学习而言,不去学习新技术就很可能被技术抛弃.Java 8一个重 ...

  3. java多线程之API初探(一)

    线程创建有两种方式:  1.实现runnable接口  2.继承thread 线程   都重写run方法 2.runnable接口优势: java 单继承但可以实现多个接口 runnable 方式可以 ...

  4. Java笔记14:泛型初探

    一.泛型简介 泛型是从Java SE 1.5开始出现的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛 ...

  5. Java并发基础框架AbstractQueuedSynchronizer初探(ReentrantLock的实现分析)

    AbstractQueuedSynchronizer是实现Java并发类库的一个基础框架,Java中的各种锁(RenentrantLock, ReentrantReadWriteLock)以及同步工具 ...

  6. Java Decimal范围_Java BigDecimal初探

    更新时间:2016-03-17 一.引言 <Effactive Java>中有这样的描述:float和double类型的主要设计目标是为了科学计算和工程计算.他们执行二进制浮点运算,这是为 ...

  7. java并发(二):初探syncronized

    参考博客 Java多线程系列--"基础篇"04之 synchronized关键字 synchronized基本规则 第一条 当线程访问A对象的synchronized方法和同步块的 ...

  8. 基于SSM的Java Web应用开发原理初探

    SSM开发Web的框架已经很成熟了,成熟得以至于有点落后了.虽然如今是SOA架构大行其道,微服务铺天盖地的时代,不过因为仍有大量的企业开发依赖于SSM,本文简单对基于SSM的Java开发做一快速入门, ...

  9. Java aio(异步网络IO)初探

    http://www.iteye.com/topic/472333 按照<Unix网络编程>的划分,IO模型可以分为:阻塞IO.非阻塞IO.IO复用.信号驱动IO和异步IO,按照POSIX ...

最新文章

  1. 数据结构:二叉搜索树(BST)的基本操作
  2. 如何结合PICgo,Typora以及阿里云对象存储OSS搭建自己图床写博客
  3. SAP Spartacus user form去除嵌套label的side effect之一
  4. Codeforces Round #681 (Div. 2, based on VK Cup 2019-2020 - Final)
  5. 如何分析线程转储–线程堆栈跟踪
  6. Veket PuppyLinux系统装在U盘中
  7. cakephp下整合kindeditor和ckplayer
  8. 所代币代币_代币网络效应
  9. 面试思考,入职初期怎么做
  10. MongoDB:Map-Reduce
  11. 谷歌800多款开源字体
  12. 十个最常用深度学习图像/视频数据标注工具
  13. 使用xlsx.core.min.js进行导入(表格)导出(Excel)功能
  14. messagedigest 图片加密_Java中MessageDigest来实现数据加密的方法
  15. k近邻算法_机器学习算法之——K最近邻(k-Nearest Neighbor,KNN)分类算法原理讲解...
  16. Ubuntu安装摄像头驱动
  17. Linux分卷压缩zip文件命令,linux下的几种分卷压缩命令
  18. 支付宝技术期末考:专业技术蓝军首次对外公开
  19. KaLi Linux 2019.2安装netspeed
  20. 全球与中国涂料和油墨用丙烯酸树脂市场发展规划展望及未来需求预测报告2021年版

热门文章

  1. Java8 Zip 压缩与解压缩
  2. 李宏毅——终身学习lifelong learning
  3. java-php-python-ssm校园疫情防控管理系统计算机毕业设计
  4. alpha 测试(α测试)与beta测试(β测试)的区别?
  5. 查找和排序-——旋转数组的最小数字
  6. 手机搜狐 html5,手机搜狐欲改版推全新域名及LOGO 着力Html5技术
  7. Unity 3D 中的专业“术语表”。
  8. Linux基础知识学习笔记-----crack_the_WiFi_secret
  9. 技术宅学会几招FFmpeg
  10. 从go语言中找和*区别