成员变量:两个ClassLoader对象defaultClassLoader、systemClassLoader
构造方法:

成员方法:

主要看蓝色小三角的四个方法,其他方法都是对该是个方法的调用。(这里是不是有什么设计思想?屏蔽实现细节?提供更易使用的方法?)
首先应该分析的是getClassLoaders这个方法,因为其他方法有对它的调用。

看起来还是很简单的,就是直接返回了一个ClassLoader数组,分别装入:
1、传入进来的ClassLoader对象
2、defaultClassLoader
3、当前线程的类加载器(说是每个类运行都是通过线程运行的,都会有个类加载器)
4、当前类的类加载器(肯定是有的,不然类怎么能加载到JVM里)
5、systemClassLoader。(看下上面的构造方法就知道,这个类初始时只对systemClassLoader进行了赋值,可以看看这个获得过程,api文档说系统类加载器是在JVM启动的时候就有了)
有了这个方法的底子之后,我们来看看下面这个方法

都是调用getResourceAsStream方法,注意传入的第二个参数,调用的是我们刚刚看的方法。

这个应该算是这个类的正餐了,这是它的主要功能之一。它的实现写的很简单,循环能拿到的所有类加载器,通过类加载器及传入的路径获取文件流。这里看到,传入的路径最前面有没有“/”都不影响。
另外一个方法也是类似的

这里的注释有亮点。。。
还有最后一个方法

循环加载器,查找对应名称的类,把它加载进来。
网友评论