类加载器类加载的过程类加载器的功能

将.class文件【物理文件:在硬盘中】加载到Java虚拟机的内存中【搬用工】。

类加载的时机情况分析:

//1,当创建Fu对象的时候【Fu.class会被加载到Java虚拟机】

Fu f = new Fu();

//2,调用类的静态方法【Fu.class会被加载到Java虚拟机】(Fu.class由于在第一步已加载到虚拟机,所以在这一步不会被加载)

Fu.showMessage();

//3访问类的静态成员变量或者给类的静态成员变量赋值【Fu.class会被加载到Java虚拟机】

String message = Fu.message;

Fu.message = “Hello Java”;

//4,创建子类对象的时候,Fu类是Zi类的父类【Fu.class会被加载到Java虚拟机】

//5,直接基于java.exe命令运行某个类【ClassLoaderDemo1.class会被加载到虚拟机】

//6,基于反射的方式强制加载到某个类到Java虚拟机中【可以指定要加载的类的全限定名进行加载(无论是否会用到)】

Class.forName(“com.yaoyao.classLoader.Fu”);//【Fu.class会被加载Java虚拟机】

★:用到就加载,不用不加载,除非反射强加载

★类加载的过程细讲类加载的步骤:

(1)加载:通过创建一个字节输入流读取要加载的类.class文件到内存中,并且根据所读取到的所有信息生成一个【★.Class对象】。

Class对象中保存了类的所有信息(构造方法+成员变量+成员方法)以及更加细致的内容(继承谁/实行谁/构造方法的权限修饰符/成员变量的权限修饰符)。

(2)验证:验证读取到的信息是否满足Java虚拟机的规范,不影响Java虚拟机的安全。

(3)准备:给类中的静态成员变量完成内存空间的分配,无论静态变量是否有初始化值,在准备这一步只给【默认值】。

(4)解析:如果当前要加载的类中要用到其他类,将其他类也一并加载。

(5)初始化:给类的静态变量完成初始化,如果有静态代码块也在这个步骤执行。

类加载器的分类

启动类加载器(Bootstrap ClassLoader):虚拟机内置的类加载器。

平台类加载器(Platform ClassLoader):负责加载JDK中的一些特殊模块。

系统类加载器(System ClassLoader):负责加载用户路径上所指定的类库。

双亲委派模型

是Java为了可以保证每一个类加载器都可以加载到自己对应的内容而设计的机制。在这种机制下没有直接继承

但有间接继承