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

这篇文章继续前一篇文章,来看一下SimpleClassLoader2的具体使用方法。

接下来我们要看一下这个问题:

为什么我们的SimpleClassLoader要支持多级目录的扫描并进行类的加载?

举个例子:

假设们要加载ClassA,它扩展了abstract AbstractClassA,实现了interface ClassAInterface,在loadClass()的过程中,AbstractClassAClassAInterface都要一起加载进来才可以。

AbstractClassAClassAInterface可能定义在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加载ProductProductImpl

本文涉及的代码在这里:

有兴趣可以下载来看看。

Powered by Jekyll and Theme by solid