java 模块化基础
java 模块化基础
- 模块化概述
- 模块化创建
- 模块信息文件(module-info.java)
- 服务
模块化概述
JDK8以前的开发模式:
- java源代码以java文件(类、接口、注解等)形式存在。
- 每一个java文件被放到一个指定的包中。
- 多个class文件组成的类库通常以jar包呈现。
- jar文件无法控制外界对其内部public类的访问。
- 等等。
模块化必须遵守的三个原则。
- 强封装性:一个模块必须能够对其他模块隐藏部分代码。
- 定义良好的接口:模块必须向其他模块公开定义良好且稳定的接口。
- 显示依赖:明确一个模块需要哪些模块的支持才能完成工作。
java 模块化系统:jigsaw(拼图)。
- 以模块(module)为中心。
- 对JDK本身进行模块化,提供一个应用程序可以使用的系统模块。
- 优点:可靠的配置(模块化配置资源),强封装性,可扩展性,安全性,性能优化。
java 模块化系统尚未成熟,目前各个开发工具支持力度不一致。且适用于大型项目。谨慎使用。
模块化创建
在eclipse中创建。
- 新建java project,可直接创建module-info.java(jdk9以上)。
或者在项目中邮件configure中的create module-info.java。 - 创建模块名称。
可以直接修改src为相应的模块名称,或者新建一个文件夹。 - 修改module-info.java文件。
- 编译,运行,打包操作。
如下图,这里在项目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 模块系统提供两种方法创建服务实例。
- 服务实现类有public的无参构造函数。
- 使用单独的静态提供者方法。
– 一个名为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 模块化基础相关推荐
- Java入门基础及面试100题--初入门
Java入门基础及面试100题 注:适合应届毕业生或java初入门者 1.面向对象的特征有哪些方面? 答:面向对象的特征主要有以下几个方面: - 抽象:抽象是将一类对象的共同特征总结出来构造类的过程, ...
- Java入门基础知识点
java语言于1995年正式推出,最开始被命名为Oak语言,由James Gosling(詹姆斯·高斯林)在Sun Microsystems公司和同事共同研发,Microsystems如今已经被ora ...
- 深入理解OSGI:Java模块化之路
Java可能是近20年来最成功的开发技术,因其具备通用性.高效性.平台移植性和安全性而成为不同硬件平台理想的开发工具.从笔记本电脑到数据中心,从游戏控制台到科学超级计算机,从手机到互联网,Java技术 ...
- 1,Java语言基础-Java语言概述和必要计算机知识
Java语言基础 Java语言概述 1,Java语言发展史 Java语言本质 Java是面向对象的高级语言,它是由c和c++发展而来. Java发展语言历史概述 Java 是由 James Gosli ...
- 2,Java语言基础-Java语言基本程序设计知识
Java语言基础 Java语言基本程序设计知识 1,JavaAPI概述 1.1,什么是API API是指应用程序接口( Application Program Interface, API),故名思意 ...
- JAVA SE基础知识总结
JAVA基础篇 1_JAVA语言概述 1.1 JAVA的总体概述 1.2 JAVA语言概述 1.2.1 基础常识 1.2.2 计算机语言的发展迭代史 1.2.3 Java语言版本迭代概述 1.2.4 ...
- java入门 慕路径,Java入门基础知识总结学习教程大全【必看经典】
类型的表达式,是循环条件,表达式3是党执行了一遍循环之后,修改控制循环的变量值. ??? for语句的执行过程是这样的:首先计算表达式1,完成必要的初始化工作:然后判断表达式2的值,如果表达式的值为t ...
- java mybatis基础
java mybatis基础 1.1 什么是mybatis? mybatis是一个优秀的持久层框架. 避免几乎所有的JDBC代码和手动设置参数以及获取结果集的过程. 可以使用简单的xml或者注解来配置 ...
- java负数右移_收入囊中篇---Java程序基础(二)
前言: 本篇是接着上一篇更新的,如果没有阅读上一篇的话,可以查阅或回顾一下. 1.收入囊中篇---Java基础必备知识(一) 2.收入囊中篇---Java程序基础(二) Java程序基础目录 1.Ja ...
最新文章
- centos gitlab mysql_CentOS-7下yum安装GitLab-CE
- Java设计模式(一) -- 工厂方法模式
- systemd管理mysql多实例_使用 systemd 配置多个 MySQL 8.0 实例
- 数据库考研SQL操作
- python中knn_如何在python中从头开始构建knn
- MySQL建表(那些字段必须)命令详解
- 刘汝佳小白书-最长回文字串
- 真西游记java,原来《西游记》原著真的很吓人,我们都被86版西游记骗了?
- 分布式存储引擎大厂实战——一文了解分布式存储的可靠性
- 【转载】当爱只是需要
- 蓝牙耳机按键事件linux,【记录】Android监听蓝牙耳机的按键事件
- 如何高效地做设计评审
- uni-app ios 苹果真机或安卓机运行
- 以终为始,向死而生——5月份英语总结
- 红帽子linux网络播放器,redhat默认播放器(totem)解码包安装
- pythonocc常见问题集锦
- 安装ubuntu16.4.7系统
- group()与groups()的区别
- 什么是过拟合?出现原因?怎么解决?
- 合规备案,BINANCE、WBFEX、OKEX等交易所全球领跑