(旧文整理)彻底搞懂Java ClassLoader(五)
这篇文章里面我们继续完善SimpleClassLoader
。
为了检查运行效果,我们可以在SimpleClassLoader2
的findClass()
方法中添加日志输出:
还要做的事情是自己加一下loadClass()
的方法:
注意上面的loadClass()
会首先使用我们自己的findClass()
方法,如果我们自己的findClass()
方法找不到指定的class,那么就会抛出ClassNotFoundException
,那么针对这个异常捕获以后,我们调用super.loadClass()
方法,让java自己的内部实现去试着加载。
为什么要这么做呢,因为我们在加载class的时候,层层向上加载「父类」,所以最终一定需要读取到Java自己的class。比如`Object`这个class,是所有class的「父类」。所以这个链条到最后就不是咱们这个「基于路径」的class loader可以处理的了,所以交给Java自己的class loader负责处理。
接下来我们就可以撰写使用class loader的代码,如下所示:
可以看到我们使用SimpleClassLoader2
来加载ProductImpl
这个class。运行上面的代码结果如下所示:
可以看到我们的class loader的工作过程。上面的输出可以看到,ProductImpl
和Product
是我们的class loader加载的,然后Object
这个class是交给super.loadClass()
去加载的。
以上就是我们的这个class loader的工作过程的分析。
这篇文章对代码的改动都在这里:
有兴趣可以看一看。
这篇文章就讲到这里,下一篇文章开始讲class loader的namespace。