Silentdoer

导航

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编辑  收藏  举报