浅谈java虚拟机原理之类加载


ClassLoader类

java.lang.ClassLoader类就是类加载器,是一个抽象类。如果开发人员要编写自己的类加载器,就必须直接或间接地继承这个类,java虚拟机在类加载时机会调用defineClass方法加载字节码文件进入jvm内存中,并创建对应的Class对象。

类加载过程

加载

查找字节码文件,并创建一个Class对象。

验证

目的在于确保class文件的字节流中包含信息符合当前虚拟机要求,不会危害虚拟机自身安全。

准备

为静态域分配空间。如static int i=5,只将i初始化为0,而5在初始化阶段才赋值。这里不包括用final修饰的static,如

final static int A=5,编译期常量不用初始化就可以被读取,而形如final static int A=new Random().nextInt()不是编译期常量,使用时会强制发生初始化。

解析

主要将常量池中的符号引用替换为直接引用。符号引用就是用一组符号来描述目标,而直接引用就是指向目标的指针、相对偏移量或y一个间接定位到目标的句柄。

初始化

初始化静态域。注意,类加载不会为实例变量分配空间和初始化。

类加载器

双亲委托模式工作原理

如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行,如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器,如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载,这就是双亲委派模式。

class文件的显式加载与隐式加载

显式加载

如Class.forName()、this.getClass().getClassLoader().loadClass()这种显式地去加载某个类,即为显式加载。

隐式加载

如在加载某个类的class文件时,该类的class文件中引用了另外一个类的对象,此时这个类就会被隐式地加载到jvm内存当中。

猜你喜欢

转载自blog.csdn.net/xl_1803/article/details/79771509
今日推荐