在慕课网学习反射时想到自己之前学过的知识,故整理一番,希望能提供一点帮助,水平有限,如若有误欢迎指正。
Java提供了两种类的装载方式。一是预先加载,二是按需加载。因为可以对类进行按需加载,所以程序在启动时不需要把所有的类都装载到JVM中,大部分类都被延迟到使用时才动态加载。
1.预先加载
这里有Java基础类的加载和含main()函数类的加载。类加载器见文末补充。
Java基础类的加载流程:启动程序到jdk目录下找到并载入jvm.dll启动虚拟机初始化参数创建BootStrap Loader对象。
BootStrap Loader对象称为启动类装载器,它会在虚拟机启动时一次性加载JJVM的基础类。
含main函数的类加载:BootStrap Loader另一项工作就是负责装载定义在sun.misc命名空间下的Launcher类。Launcher类有两个内部类,ExcClassLoader和AppClassLoader,其中,ExtClassLoader的父加载器被设置为null,表示它的父加载器为BootStarp Loader,即它由BootStrap Loader直接装载,而AppClassLoader的父加载器为ExtClassLoader,含有main函数入口的类由AppClassLoader在程序启动时加载。
2.按需加载
即运行时动态装载,当需要使用这个类时,JVM才会去动态装载它。
1.装载条件:当一个类的静态成员被第一次引用时,JVM就会去装载它,包括【静态方法-静态属性-构造方法】
需要特别注意的是:
①当访问静态常量属性时,JVM加载类不会进行类的初始化工作。
②虽然构造方法没