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 2023-10-18 17:45 Silentdoer 阅读(30) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 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,不使用注册中心