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,有了模块化后应该是可以解决这个问题;
posted on 2023-10-18 17:45 Silentdoer 阅读(26) 评论(0) 编辑 收藏 举报