(旧文整理)彻底搞懂Java ClassLoader(五)

这篇文章里面我们继续完善SimpleClassLoader

为了检查运行效果,我们可以在SimpleClassLoader2findClass()方法中添加日志输出:

还要做的事情是自己加一下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的工作过程。上面的输出可以看到,ProductImplProduct是我们的class loader加载的,然后Object这个class是交给super.loadClass()去加载的。

以上就是我们的这个class loader的工作过程的分析。

这篇文章对代码的改动都在这里:

有兴趣可以看一看。

这篇文章就讲到这里,下一篇文章开始讲class loader的namespace。

My Github Page: https://github.com/liweinan

Powered by Jekyll and Theme by solid

If you have any question want to ask or find bugs regarding with my blog posts, please report it here:
https://github.com/liweinan/liweinan.github.io/issues