JVM一般是懒加载的,即当程序真正去使用一个类时,类加载器加载该类到虚拟机中,而不是一启动就将路径下所有的类都加载进来,所以在程序运行过程中,loadClass会经常被调用去加载class文件进入虚拟机,下面来看下loadClass里面具体都做了什么
loadClass()过程
loadClass中采用了双亲委派机制,最终使用findClass加载类,类完整的加载过程需要经过加载、验证、准备、解析、初始化、使用、卸载七个阶段,前五个阶段并非是前一个阶段执行完成,才能执行后一个阶段,中间可能是交织进行的。
加载:将class文本文件转化为二进制字节流,加载进JVM中,加载过程中会生成一个Class对象,作为这个类各种数据的访问入口<br>真正加载之前涉及双亲委派机制,决定使用哪个类加载器加载该类<br>
验证:验证字节流是否符合JVM虚拟机规范
准备:为类中定义的静态变量分配内存和赋初始值,final变量直接赋值
解析:将类中常量池内的符号引用替换为直接引用,javap -v MyMath.class
初始化:给静态变量赋值,并执行静态代码块。(实例变量内存分配和赋初值,使用到的时候,现在仅仅是加载类)