JDK9 新特性
最重要的就是支持模块化编程,和接口私有方法
例子中提供服务的 module-info.java 文件 项目A
/**
*
* 1 一个项目,或者说一个jar包只能被属于一个模块,
* 2 如果没有配置模块就是全部使用(没有配置包含2种,引用方和被引用方)
* 3 使用模块相当于值暴露一部分需要对外提供服务的类,没有暴露的类不可见(我有两个包,A,B,但是值暴露A,那么引用方如果也使用模块化管理,就只能看到A,看不到B)
* 4 jdk9 以后 所有的 java jar包前面都爆了一层 moduleName
* 5 可以认为模块是 一个jar包下面,一组对外暴露服务的包 的别名
* 6 一般模块的命名就是 这些包的公共前缀,或者公共前缀+能代表这些包的一个名字
*
* @author ZHANGYUKUN
* @date 2022/6/16
*/
module com.lomi.jdkOne {
exports com.lomi.jdk9One1;
}
例子中引用上面服务(项目A ) jar的另外一个服务(项目B)的module-info.java 文件(maven 中已经导入 项目A的 jar包)
/**
*
* 1 如果一个项目引用了一个jar,但是自身没有配置module-info.java,那么相当于使用了这个jar 的全部类
* 2 如果一个项目引用了一个jar,但是自身配置module-info.java,那么必须在导入了这个 jar的 模块名才能使用里面的 暴露服务类
*
* @author ZHANGYUKUN
* @date 2022/6/16
*/
module com.lomi.jdkTwo {
requires com.lomi.jdkOne;
}
项目结构如下:
测试代码如下:
package com.lomi.jdkTwo1;
import com.lomi.jdk9One1.Goods;
import com.lomi.jdk9One2.Book;
import org.junit.Test;
import java.io.*;
import java.util.*;
import java.util.stream.Stream;
/**
* @author ZHANGYUKUN
* @date 2022/6/16
*/
public class JDK9NewTest1 {
/**
* 使用模块,相当于在package 上面 多了一层,如果在classpath 根目录有了 module-info.java 文件,那么引用的jar包就不是全部使用,而需要在 module-info.java 里面声明使用
*/
@Test
public void test1(){
//Goods的包被暴露出来可以倍使用(如果不导入模块,就使用,是不能编译通过,除非当前工程不使用模块化管理)
//模块化管理是相互的,需要 引用方和被引用方都 使用模块化管理才有效
ShoppingCart shoppingCart = new ShoppingCart();
shoppingCart.getGoodsList().add( new Goods() );
//Book的包没有被暴露出来,不能使用(但是目前版本的编译并不会保存,估计后面版本会优化),下面的代码允许会抛出异常
//Book book = new Book();
System.out.println( shoppingCart );
}
/**
* 匿名内部类前面使用<>不会报错,之前java8会报错
*/
@Test
public void test2(){
//java8 只能这样写
Comparator