我是靠谱客的博主 爱撒娇烤鸡,最近开发中收集的这篇文章主要介绍java module_理解Java 9的open module(公开模块),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

模块化是Java 9新增的一个很重要且影响代码结构的特性。

分类

根据外部代码在编译时和运行时对模块的访问权限不同分为:常规模块(normal module)和公开模块(open module)。

编译时访问比较容易理解,即代码能否显式直接使用模块里的类型,没有权限访问,编译时报错。在运行时访问模块代码是指使用Java里的Core Reflection API,反射访问。

在一些框架里如Spring Framework,在运行时常常会使用反射机制访问代码。

常规模块

声明常规模块在module前没有关键字open。module com.example {

}

外部代码访问常规模块,不管是在编译时(compile time)还是在运行时(runtime)都只授权访问模块明确导出的包里的类型。module com.example {

exports com.example.service;

}

在这个示例里,外部代码只能访问模块com.example里的com.example.service类型,对于其他没有导出的包不能访问。

另外,即使是模块导出的包,也并不是包里的所有类型都能访问,外部代码只能访问public和protected类型,以及这里类型里的public和protected成员变量和方法。

公开模块

声明公开模块在module前添加关键词open。open module com.example {

}

外部代码访问公开模块,在编译时只授权访问模块明确导出的包里的类型。而在运行时则能够访问模块里的所有包类型。open module com.example {

exports com.example.service;

}

与常规模块一样,在编译时,外部代码只能访问模块导出的com.example.service里的类型,且也只能访问包里的public和protected类型,以及这些类型里的public和protected成员。

在运行时,外部代码则可以访问公开模块的所有包里的类型以及这些类型的成员,不受类型是否为public或protected控制。

opens指令

但有时不需要对模块的所有包都公开,这种情况可以在module的声明体里使用opens指令。module com.example {

exports com.example.service;

opens com.example.service.spi;

}

对于使用opens公开的包,在运行时,外部代码对这些包里的所有类型都是可以使用反射机制访问到的。

注意:opens指令只能在常规模块中使用,不能用在公开模块里。这是比较容易理解的,因为在公开模块里所有的包都是公开的。

最后

以上就是爱撒娇烤鸡为你收集整理的java module_理解Java 9的open module(公开模块)的全部内容,希望文章能够帮你解决java module_理解Java 9的open module(公开模块)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(64)

评论列表共有 0 条评论

立即
投稿
返回
顶部