java 模块化基础

  • 模块化概述
  • 模块化创建
  • 模块信息文件(module-info.java)
  • 服务

模块化概述

JDK8以前的开发模式:

  • java源代码以java文件(类、接口、注解等)形式存在。
  • 每一个java文件被放到一个指定的包中。
  • 多个class文件组成的类库通常以jar包呈现。
  • jar文件无法控制外界对其内部public类的访问。
  • 等等。

模块化必须遵守的三个原则。

  1. 强封装性:一个模块必须能够对其他模块隐藏部分代码。
  2. 定义良好的接口:模块必须向其他模块公开定义良好且稳定的接口。
  3. 显示依赖:明确一个模块需要哪些模块的支持才能完成工作。

java 模块化系统:jigsaw(拼图)。

  • 以模块(module)为中心。
  • 对JDK本身进行模块化,提供一个应用程序可以使用的系统模块。
  • 优点:可靠的配置(模块化配置资源),强封装性,可扩展性,安全性,性能优化。

java 模块化系统尚未成熟,目前各个开发工具支持力度不一致。且适用于大型项目。谨慎使用。

模块化创建

在eclipse中创建。

  1. 新建java project,可直接创建module-info.java(jdk9以上)。
    或者在项目中邮件configure中的create module-info.java。
  2. 创建模块名称。
    可以直接修改src为相应的模块名称,或者新建一个文件夹。
  3. 修改module-info.java文件。
  4. 编译,运行,打包操作。

如下图,这里在项目MOOC_NEW下创建了名为MOOC_NEW的mudule。且在MOOC_NEW模块下创建了3个包。包下创建对应的java文件。
在module-info.java中编写模块的配置。

模块信息文件(module-info.java)

  • 模块安全连接的关键。
  • 是与模块与外界沟通的桥梁。
  • 模块名称必须唯一。
//模块名称MOOC_NEW
module MOOC_NEW {//esports输出给别人使用。exports cn.hello;//需要的依赖。requires MOOC_NEW1;
}

requires调用其他模块。

  • java --list-modules:查看jdk提供的模块。
  • java --describe-module 看具体某一模块。
  • requires可以添加多个模块,中间以逗号隔开。
  • 采用requires transitive N,编译和运行时都传递依赖N。
  • requires static N,编译依赖N,运行可选。
  • requires transitive static N,编译传递依赖,运行时可选。

exports 将当前模块输出。

只有输出,别人才可以使用,否则别人连采用反射的机会都没有。

  • exports <package>,指定输出哪些包。
  • exports <package> to<module1>, <module1>; 限定输出到某些模块。

opens 将当前模块开放用于反射。

  • exports导出的包可以用于反射。
  • opens可以打开一些包用于反射。
  • open module 某块名称,打开整个模块。
  • opens <package>,打开一个包。
  • opens <package> to <module1>, <module2>; 仅对某些模块打开一个包。

服务

  • java模块系统引入新功能,实现解耦。
  • 模块对外只暴露接口,隐藏实现类。
  • provides提供接口,with实现类(不导出)。
  • uses消费接口。
  • ServiceLoader加载接口的实现类。

如:在模块MOOC_NEW的module-info.java中:

module MOOC_NEW {exports first.p1;provides first.p1.Shoewith first.p2.Nike;
}

在模块MOOC_NEW1的module-info.java中:

module MOOC_NEW1 {requires MOOC_NEW;uses first.p1.Shoe;
}

在模块MOOC_NEW中,定义了接口Shoe及其实现类。分别位于first.p1和first.p2中。
在模块MOOC_NEW1中的second.p1包中,编写测试文件如下:

package second.p1;import java.util.ServiceLoader;
import first.p1.Shoe;public class ShoeTest {public static void main(String[] args) {ServiceLoader<Shoe> objs = ServiceLoader.load(Shoe.class);for(Shoe obj : objs) {obj.wolk();}}
}
  • ServiceLoader通过load加载接口的实现类(with语句提供)。

  • 每次load,都会产生新的各自的对象。

  • 可以调用reload进行刷新。

  • java 模块系统提供两种方法创建服务实例。

  1. 服务实现类有public的无参构造函数。
  2. 使用单独的静态提供者方法。
    – 一个名为provider的public static无参数方法。
    – 返回服务接口或者子类。

如,在模块MOOC_NEW下的包first.p1下创建一个类shoeFactory。

public class shoeFactory{public static Shoe provider(){Shoe shoe = new Nike();return shoe;}
}

并将模块MOOK_NEW的module-info.java文件改为:

module MOOC_NEW{exports first.p1;provider first.p1.Shoewith first.p1.shoeFactory;
}

java 模块化基础相关推荐

  1. Java入门基础及面试100题--初入门

    Java入门基础及面试100题 注:适合应届毕业生或java初入门者 1.面向对象的特征有哪些方面? 答:面向对象的特征主要有以下几个方面: - 抽象:抽象是将一类对象的共同特征总结出来构造类的过程, ...

  2. Java入门基础知识点

    java语言于1995年正式推出,最开始被命名为Oak语言,由James Gosling(詹姆斯·高斯林)在Sun Microsystems公司和同事共同研发,Microsystems如今已经被ora ...

  3. 深入理解OSGI:Java模块化之路

    Java可能是近20年来最成功的开发技术,因其具备通用性.高效性.平台移植性和安全性而成为不同硬件平台理想的开发工具.从笔记本电脑到数据中心,从游戏控制台到科学超级计算机,从手机到互联网,Java技术 ...

  4. 1,Java语言基础-Java语言概述和必要计算机知识

    Java语言基础 Java语言概述 1,Java语言发展史 Java语言本质 Java是面向对象的高级语言,它是由c和c++发展而来. Java发展语言历史概述 Java 是由 James Gosli ...

  5. 2,Java语言基础-Java语言基本程序设计知识

    Java语言基础 Java语言基本程序设计知识 1,JavaAPI概述 1.1,什么是API API是指应用程序接口( Application Program Interface, API),故名思意 ...

  6. JAVA SE基础知识总结

    JAVA基础篇 1_JAVA语言概述 1.1 JAVA的总体概述 1.2 JAVA语言概述 1.2.1 基础常识 1.2.2 计算机语言的发展迭代史 1.2.3 Java语言版本迭代概述 1.2.4 ...

  7. java入门 慕路径,Java入门基础知识总结学习教程大全【必看经典】

    类型的表达式,是循环条件,表达式3是党执行了一遍循环之后,修改控制循环的变量值. ??? for语句的执行过程是这样的:首先计算表达式1,完成必要的初始化工作:然后判断表达式2的值,如果表达式的值为t ...

  8. java mybatis基础

    java mybatis基础 1.1 什么是mybatis? mybatis是一个优秀的持久层框架. 避免几乎所有的JDBC代码和手动设置参数以及获取结果集的过程. 可以使用简单的xml或者注解来配置 ...

  9. java负数右移_收入囊中篇---Java程序基础(二)

    前言: 本篇是接着上一篇更新的,如果没有阅读上一篇的话,可以查阅或回顾一下. 1.收入囊中篇---Java基础必备知识(一) 2.收入囊中篇---Java程序基础(二) Java程序基础目录 1.Ja ...

最新文章

  1. centos gitlab mysql_CentOS-7下yum安装GitLab-CE
  2. Java设计模式(一) -- 工厂方法模式
  3. systemd管理mysql多实例_使用 systemd 配置多个 MySQL 8.0 实例
  4. 数据库考研SQL操作
  5. python中knn_如何在python中从头开始构建knn
  6. MySQL建表(那些字段必须)命令详解
  7. 刘汝佳小白书-最长回文字串
  8. 真西游记java,原来《西游记》原著真的很吓人,我们都被86版西游记骗了?
  9. 分布式存储引擎大厂实战——一文了解分布式存储的可靠性
  10. 【转载】当爱只是需要
  11. 蓝牙耳机按键事件linux,【记录】Android监听蓝牙耳机的按键事件
  12. 如何高效地做设计评审
  13. uni-app ios 苹果真机或安卓机运行
  14. 以终为始,向死而生——5月份英语总结
  15. 红帽子linux网络播放器,redhat默认播放器(totem)解码包安装
  16. pythonocc常见问题集锦
  17. 安装ubuntu16.4.7系统
  18. group()与groups()的区别
  19. 什么是过拟合?出现原因?怎么解决?
  20. 合规备案,BINANCE、WBFEX、OKEX等交易所全球领跑

热门文章

  1. iviewtable表格数据 录音播放下载
  2. Flask框架 - 初识
  3. 关于修改docker(非docker-engine)的日志引擎
  4. 分享一下10个常用jquery片段
  5. C# Wpf异步修改UI,多线程修改UI(二)
  6. 斐波那契数列(大数)
  7. 【jquery】find() 方法,filter()方法和children()方法
  8. 佳能发售曝光对应的「IXY DIGITAL 3000 IS」
  9. 一只青蛙跳向三个台阶_在藏区流传的青蛙王子的故事
  10. 动态规划——零钱兑换(Leetcode 322)