类加载过程有哪些,类加载器有哪些?

87 阅读2分钟

类加载机制:JVM把Class文件加载到内存,并对数据进行校验,转换解析和初始化,形成虚拟机可以直 接使用的Java类型,即Java.Lang.Class。

类加载的过程:

装载(Loading):类加载器根据类的全限定名称,来读取此类的二进制字节流到JVM内部,并存储到运行 时内存的方法区,然后将其转换为一个与目标类型对应的java.lang.Class对象实例。 链接(Linking):(1)验证:格式验证,语义验证,操作验证(2)准备:为类中的所有静态变量、常量 分配内存空间,并为其设置一个初始化;(3)解析:将常量池中的符号引用转为直接引用。 初始化(Initialize):执行类构造器init方法,包含为静态变量赋值,执行static代码块。 创建对象:

1.在堆内存为实例对象分配内存; 2.为实例变量赋默认值; 3.执行实例初始化代码; 4.将堆区对象的地址赋值给栈区的引用变量。 类加载器:当一个JVM启动时,Java开始使用如下三种类加载器:

启动类加载器(Bootstrap ClassLoader):负责加载存放在JDK\jre\lib下,或被-Xbootclasspath参数 指定的路径中的,并且能被虚拟机识别的类库。启动类加载器是由C++实现的,没有对应的Java对 象,因此在Java中只能用null代替。 扩展类加载器(Extension ClassLoader):负责加载Java平台中扩展功能的一些jar包,包括

JDK/jre/lib/*.jar或-Djava.ext.dirs指定目录下的jar包,开发者可以直接使用扩展类加载器。 应用程序类加载器(Application ClassLoader):负责加载用户类路径(ClassPath)所指定的类,开 发者可以直接使用该类加载器,如果应用程序中没有自定义过自己的类加载器,一般情况下这个就 是程序中默认的类加载器。 自定义类加载器(Custom ClassLoader):通过继承java.lang.ClassLoader根据自身需要自定义 ClassLoader,如tomcat、jboss都会根据j2ee规范自行实现ClassLoader。

双亲委派原则: (1)如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载 器去执行;

(2)如果父类的加载器还存在其父类加载器,则进一步向上委托,依次递归,最终请求会最终到达顶层 的启动类加载器;

(3)如果父类加载器可以完成类的加载任务,就成功返回,倘若无法完成此项任务,为委派给他的子类 加载器。

如何打破双亲委派:

自定义加载器,重写loadClass方法。

使用线程上下文类加载器