初步理解Java类加载机制
在程序启动的时候,并不会一次性加载程序所需的所有
.class
文件,而是根据程序的需要,通过ClassLoader
来动态加载某个.class
文件到内存中;只有.class
文件在内存中,才能被其他class
所引用。所以,ClassLoader
就是用来动态地加载.class
文件到内存中
Java默认提供的三个ClassLoader
BootStrap ClassLoader
BootStrap ClassLoader
称为启动类加载器。用来加载JDK核心类库。来看一下,BootStrap ClassLoader
类加载器从哪些地方加载了相关的jar或class文件
|
|
执行结果如下:
|
|
上述结果也可以通过查找sun.boot.class.path这个系统属性所得知
Extension ClassLoader
Extension ClassLoader
称为拓展类加载器。负责加载Java的拓展类库;默认情况下,加载JAVA_HOME/jre/lib/ext/
目录下的所有jar
App ClassLoader
App ClassLoader
称为系统类加载器,负责加载应用程序classpath目录下所有的jar和class文件
获取某个类由哪个类加载器加载
|
|
上面代码的运行结果
|
|
下面的代码纯属演示,演示loadClass(String className)方法,没有实际意义
|
|
自定义类加载器,加载本机文件
自定义的ClassLoader都必须继承自java.lang.ClassLoader类。
Extension ClassLoader
和App ClassLoader
都继承java.lang.ClassLoader类。但是Bootstrap ClassLoader
不继承自java.lang.ClassLoader
,因为它不是一个普通的Java类,底层由C++编写,已嵌入到了JVM内核当中,当JVM启动后,Bootstrap ClassLoader
也随着启动,负责加载完核心类库后,并构造Extension ClassLoader
和App ClassLoader
类加载器。
第一步: 在本机非项目CLASSPATH位置新建.java文件,并编译
名称是Member.java,内容如下:
|
|
第二步: 定义自己的类加载器
|
|
可以自己修改上述代码中,文件路径硬编码的地方
测试自己的类加载器
|
|
输出结果是:
|
|
类加载器的意义是:通过动态的路径实现类加载处理操作。