1. Class files
一般而言,我们都会将逻辑代码编写在以.java为后缀的文件中。class文件则是由java文件编译【使用javac命令编译】而成。
2. 类加载器子系统
class文件已经有了,那么class文件又是如何加载进虚拟机的呢?这时不得不提一下类加载器。类加载器,顾名思义,就是实现对类的加载-类加载器的主要任务就是将class文件加载进虚拟机内存。 从JAVA虚拟机的角度来看,类加载器可分为两种,一种是启动类加载器,用于加载虚拟机运行时所需类库。另一种是其他类加载器,用于加载非启动类库的其他所有类库。 从java开发人员的角度来看,类加载器还可以做更细致的划分,可分为:启用类加载器、扩展类加载器、应用程序类加载器及自动类加载器。如下图:
双亲委派模型
当类加载器收到类的加载请求时,首先自身不尝试去加载这个类,而是将这个类请求委派给父类加载器去完成。每个类加载 器都如此。因此所有的类加载请求都会传递到顶级类加载器【启动类加载器】,只有当父类加载器无法完成类加载请求时,子类加载器才会尝试自己去加载。
如当类加载器加载java.lang.String类时。首先应用程序类加载器会接收到java.lang.String类的加载请求,因为应用序类加载器有父类加载器,所以应用程序类加载器不会尝试去加载java.lang.String类,而是将加载java.lang.String类的请求传递给父类加载器【扩展类加载器】。又因为扩展类加载器也有父类加载器【启用类加载器】,所以扩展类加载器也不去加载java.lang.String类,而是将加载java.lang.String类的请求传递给父类加载器【启动类加载器】。启动类加载器是顶级加载器,无父类加载器。它将尝试去加载java.lang.String类,刚好在rt.jar中找到了java.lang.String类,于是将该类加载进虚拟机。如果要加载的类并不在rt.jar里时。启动类加载器无法处理类请求,则会将类的加载请求下放子类加载器去处理。 如下图:
类加载器内部是如何实现类加载的?这时候就要介绍一下类的加载过程。 类的加载时机分5步:加载、连接【验证、准备、解析】、初始化、使用、与卸载。其中加载、验证、准备、解析、初始化为类的加载全过程。如下图:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。