自定义一个类加载器代码实现
目标:
- 自定义一个类加载器,对硬盘上的
某.class文件进行加载。 - 代码验证此
某.class文件是由那个类加载器完成加载的。 - 代码验证,通过 new 类加载的操作,能够实现热加载的功能。
- 首先写一个
HelloWorld类,javac拿到的.class文件放入指定路径(自定义)中。
1 | // 路径:/Users/lee/Desktop/gg/HelloWorld.class |
- 自定义一个类加载器,代码如下:
1 | import java.io.ByteArrayOutputStream; |
- 最后写一个测试类:
1 | import java.lang.reflect.InvocationTargetException; |
console 输出结果为:
1 | 自定义 cl 的 cl 是:sun.misc.Launcher$AppClassLoader@18b4aac2 |
- 若
executeMethod方法被注释,那么 HelloWorld 类的静态代码块将不会被执行(仅完成加载,未进入初始化过程),即starting不会被打印出来。 - 做了两次 new MyCL 的操作,发现它们的类加载器没变过,但是得到的 Class 类完全不同。说明,同一份
.class文件,同样的全限定名称,MyCL不同时,也会加载两种类文件,实现了热加载的功能。
整体流程如图:

分析:不管是 Test 主类、自定义类加载器类还是待处理的.class文件,这里都是通过 APPClassLoader 进行加载的,通过上边的 console 输出也能证明这一点。
我们定义的加载器,是作为初始类加载器使用的,真正发挥作用的还是 AppClassLoader。
参考文章:《Java 高并发编程详解》第10章164页
