AppClassLoader
疑问
为何 继承ClassLoader的自定义类加载器默认会调用super()传入默认的AppClassLoader作为parent?
带着这个疑问 , 查看了下URLClassLoader的源码
根据URLClassLoader继承了ClassLoader,
URLClassLoader
类加载器的实例隔离Class对象中MyClassLoader隐式的调用了super()
ClassLoader.getSystemClassLoader()获取系统默认
Launcher 去获取 ClassLoader
返回的this.loader
this.loader在初始化Launcher的时候去初始化
注入ExtClassLoader作为AppClassLoader的parent 并返回该AppClassLoader。
由此已经解决了疑问 【为何 继承ClassLoader的自定义类加载器默认会调用super()传入默认的AppClassLoader作为parent?】
AppClassLoader的类加载目录
顺便了解了一下系统类加载器 App ClassLoader中提到AppClassLoader加载的 -cp/-classpath 指定的类库资源,但是为何呢?
因为如图可以看见 初始化AppClassLoader的时候, 已经指定了java.class.path
作为其加载类的目录。而java.class.path
包含了classpath的目录
AppClassLoader加载的是java.class.path指定的目录,其包含-classpath指定的目录
-classpath
ps:ExtClassLoader类似