Silentdoer

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

java模块化初步理解

1.先看两个命令:

jdeps HelloWorld.class

HelloWorld.class -> java.base
   <unnamed>                                          -> java.io                                            java.base
   <unnamed>                                          -> java.lang                                          java.base

可以看到HelloWorld.class里只用到了java.base模块,且只用到这个模块里的java.io和java.lang两个package【说实在话,这个模块名就不应该用java.base这样的格式,看着还以为是package】

所以我们运行HelloWorld.class是不需要用到完整的jre的,可以用jlink命令来生成更小的可执行java文件:

 

jlink \
         --add-modules java.base \
         --strip-debug \
         --no-man-pages \
         --no-header-files \
         --compress=2 \
         --output /javaruntime
/javaruntime/bin/java HelloWorld

/javaruntime目录大小会比完整jre小很多;

 

通过这个例子就能大概理解模块化是干啥,就是将jdk拆分了很多模块,这样如果我们的应用程序只需要其中几个模块,可以拆出这几个模块组成完整的程序;

 

自己写的库也可以模块化,但是感觉不是很必要,因为如果要分两个模块,可以直接分两个项目生成两个jar包即可。。(还是有用的)

模块化和分jar包的另一个区别是,模块化可以更加精细的控制权限,比如一个jar包它里面的所有代码其实都可以被引用,private也可以被反射使用;

而模块化在module.info里可以配置哪个模块依赖哪个模块,哪个模块只把模块里的哪些包给其他哪个模块使用。

而且即便是public的类,如果它这个模块没有open或export这个类的包,则外部也是访问不到的。(open包和export包的区别是export的包里的private是不允许反射的)

 

还有一个就是模块可以使得包访问权限的类无法被另一个 特意写成 和这个包路径一样的其他类所访问,比如之前是aa.bb.Mm,Mm是包访问权限,即aa.bb包下的其他类可以访问到这个类;

但是开发者其实不希望被访问,但是以前用户可以自己也写一个aa.bb.Ss,哪怕Ss和Mm不在一个lib里但是它们是相同的包所以Ss能访问Mm,有了模块化后应该是可以解决这个问题;

作者:Silentdoer
欢迎任何形式的转载,但请务必注明出处。
限于本人水平,如果随笔/文章及代码有表述不当之处,还请不吝赐教。

posted on   Silentdoer  阅读(30)  评论(0编辑  收藏  举报

编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
历史上的今天:
2022-10-18 SpringBoot引入OpenFeign,不使用注册中心
点击右上角即可分享
微信分享提示