1.1 类的加载器时机
-
创建类的实例。
-
类的静态变量,或者为静态变量赋值。
-
类的静态方法。
-
使用反射方式来强制创建某个类或接口对应的java.lang.Class对象。
-
初始化某个类的子类。
-
直接使用java.exe命令来运行某个主类。
以上6个情况,只要有1个出现,那么类的加载器就会将这个类的class文件加载到内存中,我们就可以使用这个类了。java.lang.ClassLoader
:是类的加载器的父类。
1.2 引导类加载器
-
BootClassLoader:类的加载,加载JDK的核心类库,进入内存
-
核心类库,jdk安装目录下的jre/lib/rt.jar 里面存储的是学习的类的class文件
-
public static void main(String[] args) { //获取一个类的加载器,类的加载器都是ClassLoader的子类 ClassLoader boot = String.class.getClassLoader(); System.out.println("boot = " + boot); }
特殊:加载器是C++编写的,根本就不是java中的类
-
1.3 扩展类加载器
-
ExtClassLoader:扩展类库加载器,加载JDK的扩展类库
-
扩展类库,jdk安装目录下的jre/lib/ext
-
//扩展类的加载器 ClassLoader ext = CurveDB.class.getClassLoader(); System.out.println("ext = " + ext); //sun.misc.Launcher$ExtClassLoader@4b67cf4d
-
1.4 应用类加载器
-
AppClassLoader:我们自己写的类,添加的jar包中的类
-
ClassLoader app = LoaderDemo.class.getClassLoader(); System.out.println("app = " + app); //sun.misc.Launcher$AppClassLoader@18b4aac2
父类加载器:AppClassLoader是ExtClassLoader的子类加载器,ExtClassLoader是BootClassLoader的子加载器
static class AppClassLoader extends URLClassLoader static class ExtClassLoader extends URLClassLoader
1.5 类加载器的双亲委派
JDK中类加载器的工作模式:谁用谁加载,双亲委派模型
1.6 Class对象创建
当一个类的class文件被类加载器加载到内存后,类的加载器会创建出此class文件的对象。class文件的对象是Class类的对象,是反射技术的基石。