JavaSE-24.3【模块化(JDK9及之后)、Window环境不同版本JDK本地共存】
1 package day15.lesson3; 2 3 /* 4 3 模块化 5 6 3.1 模块化概述 7 8 Java语言随着这些年的发展已经成为了一门影响深远的编程语言,无数平台,系统都采用Java语言编写。 9 但是,伴随着发展,Java也越来越庞大,逐渐发展成为一门“臃肿” 的语言。 10 而且,无论是运行一个大型的软件系统,还是运行一个小的程序,即使程序只需要使用Java的部分核心功能, JVM也要加载整个JRE环境。 11 为了给Java“瘦身”,让Java实现轻量化,Java 9正式的推出了模块化系统。 12 Java被拆分为N多个模块,并允许Java程序可以根据需要选择加载程序必须的Java模块,这样就可以让Java以轻量化的方式来运行。 13 其实,Java 7的时候已经提出了模块化的概念,但由于其过于复杂,Java 7,Java 8都一直未能真正推出,直到Java9才真正成熟起来。 14 对于Java语言来说,模块化系统是一次真正的自我革新,这种革新使得“古老而庞大”的Java语言重新焕发年轻的活力 15 16 图 17 18 PS:目前本地为JDK8环境,以下操作还实现不了QAQ 19 20 3.2 模块的基本使用 21 22 1. 在项目中创建两个模块。一个是myOne,一个是myTwo 23 File-->new-->Module 24 或 25 File-->Project turcture-->+add-->new Module 26 27 2. 在myOne模块中创建以下包和以下类,并在类中添加方法 28 com.yppah_01包 29 Student类 30 study() 31 com.yppah_02包 32 Teacher类 33 teach() 34 35 3. 在myTwo模块中创建以下包和以下类,并在类中创建对象并使用 36 cn.yppah包 37 Test01类 38 main() 39 40 4. 在myOne模块中src目录下,创建module-info.java描述性文件 41 右键src-->new-->module-info.java 42 (1)module-info.java 43 该文件专门定义模块名、访问权限、模块依赖等信息 44 描述性文件中使用模块导出和模块依赖来进行配置使用 45 (2)模块中所有未导出的包都是模块私有的,不能在模块之外被访问 46 在myOne模块的描述性文件中配置模块导出 47 格式: 48 exports 包名 49 50 5. 在myTwo模块中src目录下,创建module-info.java 51 一个模块要访问其他模块,必须明确指定依赖哪些模块,未明确指定依赖的模块不能访问 52 在myTwo模块的描述性文件中配置模块依赖 53 格式: 54 requires 模块名 55 注意:写模块名会报错,需要按alt+enter提示,然后选择模块依赖 56 完成上述后,即可再myTwo模块下的类中使用依赖模块下的内容了 57 58 3.3 模块服务的基本使用 59 myOne模块 60 src 61 com.yppah_03包 62 MyService接口 63 service()抽象方法声明 64 impl包 65 MyServiceImpl1类 实现MyService 66 重写实现service() 67 MyServiceImpl2类 实现MyService 68 重写实现service() 69 描述文件module-info.java 70 模块导出:exports com.yppah_03; 71 服务提供:provides MyService with MyServiceImpl1; <--指定MyService的服务实现类是MyServiceImpl1 72 73 myTwo模块 74 描述文件module-info.java 75 声明服务接口:uses MyService; 76 src 77 cn.yppah包 78 Test02类 79 main() 使用MyService接口 80 在myTwo模块的类中使用MyService接口提供的服务 81 ServiceLoader类:一种加载服务实现的工具 82 */ 83 public class Demo1Module { 84 public static void main(String[] args) { 85 System.out.println("javase 完结撒花 冲冲冲"); 86 } 87 }
myOne模块(~甲方)
package com.yppah_01; public class Student { public void study(){ System.out.println("好好学习天天向上"); } }
package com.yppah_02; public class Teacher { public void teach(){ System.out.println("好好教书"); } }
package com.yppah_03; public interface MyService { void service(); }
package com.yppah_03.impl; import com.yppah_03.MyService; public class MyServiceImpl1 implements MyService { @Override public void service() { System.out.println("好好学java"); } }
package com.yppah_03.impl; import com.yppah_03.MyService; public class MyServiceImpl2 implements MyService { @Override public void service() { System.out.println("go go go"); } }
1 import com.yppah_03.MyService; 2 import com.yppah_03.impl.MyServiceImpl1; 3 import com.yppah_03.impl.MyServiceImpl2; 4 5 module myOne { 6 exports com.yppah_01; 7 8 exports com.yppah_03; 9 // provides MyService with MyServiceImpl1; 10 provides MyService with MyServiceImpl2; //服务提供者:修改服务实现类,myTwo模块下的使用者不知情 11 }
myTwo模块(~乙方)
package cn.yppah; //import com.yppah_01.Student; //编译异常 //import com.yppah_02.Teacher; //编译异常 //正常来讲,这属于跨模块访问,无法访问 //JDK9之后,在配置描述性文件后,可以实现 <----jdk9新特性之模块化 public class Test01 { public static void main(String[] args) { // Student s = new Student(); // s.study(); // Teacher t = new Teacher(); // t.teach(); } }
package cn.yppah; import com.yppah_03.MyService; import java.util.ServiceLoader; public class Test02 { public static void main(String[] args) { //加载服务 ServiceLoader<MyService> sl = ServiceLoader.load(MyService.class); //遍历服务 for (MyService ms: sl){ ms.service(); } } }
1 import com.yppah_03.MyService; 2 3 module myTwo { 4 requires myOne; //依赖模块首次配置会报错,按alt+回车,自动添加依赖 5 6 uses MyService; //服务使用者:只需要面向接口编程 7 }
20210621记