(旧文整理)彻底搞懂Java ClassLoader(四)
这篇文章继续前一篇文章,来看一下SimpleClassLoader2
的具体使用方法。
接下来我们要看一下这个问题:
为什么我们的SimpleClassLoader要支持多级目录的扫描并进行类的加载?
- 因为对某个类的加载是与加相关的所有资源的加载,而不是它本身单独的加载。
举个例子:
假设们要加载ClassA
,它扩展了abstract AbstractClassA
,实现了interface ClassAInterface
,在loadClass()
的过程中,AbstractClassA
与ClassAInterface
都要一起加载进来才可以。
而AbstractClassA
与ClassAInterface
可能定义在ClassA
的上级目录中,这样的话,对多级路径的支持就成为了必须。
接下来做一个实际的例子。首先定义一个Product
接口如下:
package io.alchemystudio.classloader.demo;
public interface Product {
void show();
}
注意我们在io.alchemystudio.classloader.demo
这个package里面定义的上面的接口。接下来做一个实现:
package io.alchemystudio.classloader.demo.impl;
import io.alchemystudio.classloader.demo.Product;
public class ProductImpl implements Product {
@Override
public void show() {
System.out.println("ProductImpl");
}
}
注意这个实现所处的package是io.alchemystudio.classloader.demo.impl
。上面代码的类图如下:
因此实现的class和接口的interface在不同的目录level里面:
因此编译后的.class
文件也在不同的目录level里:
所以我们的classloader如果要想在runtime加载ProductImpl.class
,那么它就必须要同时向上一级目录搜索,找到Product.class
,这就是为什么我们的SimpleClassLoader
要设计成可以扫描多层目录。
本文就先分析到这里,下一篇文章里我们来实际的运行我们的SimpleClassLoader
在runtime加载Product
和ProductImpl
。
本文涉及的代码在这里:
有兴趣可以下载来看看。