类加载器加载.class文件的过程
类加载器加载文件是在程序运行期间加载的(这样就给我们开发人员提供很好的操作空间 )
类加载器是什么?
我们编译好的.java文件是通过javac文件编译成的.class文件
类加载器负责把.class文件中的二进制数据结构读入到内存的数据区的方法区中
类加载器加载可以加载那里的.class文件(jvm规范没有明确指明.class文件必须得那里加载)
- 从本地直接加载
- 通过网络加载.class文件
- 从zip.jar等归档文件中加载.class文件(从jar包中加载.class文件)
- 从专有数据库中提取.class文件
- 将java文件动态编译成.class文件(比如jsp文件编译成java文件在编译成.class文件)
类加载器将.Class文件从磁盘中读取到内存中的五个阶段
- 加载:类加载器把.class文件的二进制数据从磁盘中读入到内存中,将其放在运行时的数据区的方法区中,然后在在内存中创建个java.lang.Class的对象(没有规范这个对象放在那里,HotSpot放在方法区中),这个对象是用来封装这个类在方法区中的数据结构
- 连接:将类与类之间关系确定好,对字节码的校验就是在这一步(因为字节码可以人为改动,所以也要对字节码进行校验) 连接分三个阶段:1验证:保证每个类的规范性,正确性.(2)准备:为类中的静态变量分配内存,并将其初始化为默认值(如:int=0)(3)解析:把类中的符号引用转换成直接引用(直接引用:直接到通过方法以指针指向的方式直接引用所用到的目标对象的位置(一下子就可以找到位置))
- 初始化:对变量进行赋值,在初始化阶段
- 使用:用这个类创建对象,调用方法
- 卸载:类加载器把.class字节码文件加载到内存里面,形成啦自己的数据结构,一旦被删除就不能再用这个类创建对象啦,因为这个类在方法区中已经不存在啦