Java9初探(二)

再谈Java9模块化

在之前已经提到了作为java9最重要的特性就是模块化。有了模块化java9变得更轻量级。在编译运行的时候可以更一步的节省资源。上一篇文章中提到了java9模块化的一些keyword。介绍的不全面,下面来补充介绍一下模块化中的keyword

exports

exports PackageName [to ModuleName {, ModuleName}] ;

定义对外暴露的包名(允许外部模块在运行编译期间访问该包下面的所有publicprotect文件或变量方法,而且允许外部模块通过反射可以访问到该包下的publicprotect文件或者变量方法)。还可以指定具体to哪个模块。这样就可以缩小对外暴露范围。只有指定的模块才可以使用该包下面的文件。否则编译报错。这样就可以对底层的模块进行保护,避免上层调用。

opens

opens PackageName [to ModuleName {, ModuleName}] ;

定义对外打开的包名(允许外部模块在运行期间访问该包下的所有publicprotect文件或变量方法,且允许外部模块通过反射访问的该包下的所有类型的资源)。所以opensexports开放的权限大,但是要通过反射去获取。同样也可以定义具体to哪个模块,指定授权该模块可访问。否则运行报错。

uses

uses TypeName ;

定义消费的服务类型。可以是一个具体的类,也可以是一个借口,或者一个注解类(不能是枚举)。然后定义后通过 java.util.ServiceLoader#load(Class)方法可以加载到该服务的具体实现类。然后循环迭代调用。

provides

provides TypeName with TypeName {, TypeName} ;

定义服务提供者。结合上面的uses使用。eg:在a模块中我定义了接口A,且定义了A的实现AImpl,然后我在b模块中requires a; use A;这样我在b模块中使用ServiceLoader加载A.class的时候就可以获得AImpl实体。也可以在b模块中新增A的实现BImpl,然后在b模块文件中定义provides A with BImpl。这样ServiceLoader就可以获取到两个不同的实现(可以根据实际需要自定义选取哪个实现)。usesprovides是模块化里面对接口的增强。
eg:

module A

public interface ITest {
    void t();
}

public class ATestImpl implements ITest {
    @Override
    public void t() {
        System.out.println("ATestImpl");
    }
}

module A {
    exports a to B;
    provides a.ITest with a.ATestImpl;
}

module B

public class TestImpl implements ITest {
    @Override
    public void t() {
        System.out.println("TestImpl");
    }
}
public class BTestImpl implements ITest {
    @Override
    public void t() {
        System.out.println("BTestImpl");
    }
}

module B {
    requires A;
    provides a.ITest with b.TestImpl;
    uses a.ITest;
}

public static void main(String[] args) {
        ServiceLoader<ITest> load = ServiceLoader.load(ITest.class);
        load.stream().forEach(t -> t.get().t());
    }

我在两个模块中定义了三个实现。但是我只声明了两个providesmodule-info中,最终执行结果为

ATestImpl
TestImpl

java9的一些小结

  • 模块化。简化java运行依赖,解耦jar包的依赖,增强封装特性等。
  • 允许在接口中定义并实现私有方法。可以提供给接口的默认方法使用(default,static),这样多个默认方法且实现代码有重复可以通过这种方式重构,使代码变得简洁。
  • 更方便的集合构建方式。可以直接使用List.of(1,2,3,4)这种方式来生成集合。系统会根据默认值推断出集合的类型。生成的集合是java.util.ImmutableCollections不可变的。
  • Stream新增takeWhile,dropWhile,ofNullable等方法。使stream操作流更灵活。还支持Optional转Stream
  • java工具大杀器JShell,直接在jdk9的bin目录下执行.jshell就可以进入JShell脚本工具里。直接运行java代码。可以抛开繁琐的包名类名main方法等。你甚至只需要执行一段可执行的代码即可,不需要写方法。
  • 其它还有很多,比如货币的支持,新的httpclient,轻量级json处理,简化进程API等等。

java9参考文档

The Java® Language
Specification

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 为什么选择Java11 容器环境支持,GC等领域的增强。 进行了瘦身,更轻量级,安装包体积小。 JDK11 是一个...
    yuhan_sining阅读 379评论 0 0
  • 一、Java平台模块系统 Java平台模块系统,也就是 Project Jigsaw,把模块化开发实践引入到了 J...
    这一刻_776b阅读 155评论 0 0
  • 原文地址:https://www.ibm.com/developerworks/cn/java/the-new-f...
    全能程序猿阅读 5,643评论 0 2
  • 1. 什么是模块化 本质上,模块化就是将系统分解成独立且相互连接的模块的行为。java9模块除了包含代码外,一个重...
    rubywang08阅读 1,457评论 0 0
  • 演习部 授曲第三 人问:既不知音,何以制曲?予曰:酿酒之家,不必尽知酒味,然秫多水少则醇醲,曲好蘖精则香冽,此理则...
    飞鸟逐溪阅读 438评论 0 0