总结:通过上面的代码我们就可以看出来,我们在Person中去new一个Dog的实例的时候,并没有创建成功,而是抛出了Exception in thread "main" java.lang.NoClassDefFoundError: com/test/Dog这样的异常,这也就证明了,我们上面所说的结论(父加载器所加载的类,不能访问子加载所加载的类。)
即启动类加载器所加载的类,不能访问系统类加载器所加载的类(AppClassLoader)。
那么肯定会有人问,我们的子加载器所加载的类,可以访问父加载器所加载的类嘛?我们不妨来证实一下,我们只需要改动一下MainClass02这个类的代码即可,让AppClassLoader去加载Dog类,让我们的自定义类加载器去加载我们的Person类。并在Person类中去访问Dog类。然后将之前C:\Program Files\Java\jdk1.8.0_131\jre\classes目录下的Person中的Class文件删除掉,另外还有把我们类路径下的Person文件删除掉,并且在I:\test\目录下添加com.test.Person.class文件。代码如下:
package com.test; import java.lang.reflect.Method; /** * jvm 类加载器 第一章 * @author 奇客时间-时光 * 自定义类加载器 * 测试子类加载器所加载的类,能否访问父加载器所加载的类。 */ public class MainClass02 { public static void main(String[] args) throws Exception { //创建自定义类加载器的一个实例,并且通过构造器指定名称 Test01ClassLoader myClassLoader = new Test01ClassLoader("loader1"); myClassLoader.setPath("I:\\test\\"); Class<?> classz = myClassLoader.loadClass("com.test.Person"); System.out.println(classz.getClassLoader()); System.out.println("Dog的类加载器:"+Dog.class.getClassLoader()); classz.newInstance(); } } 运行结果: "C:\Program Files\Java\jdk1.8.0_144\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2019.2\lib\idea_rt.jar=60588:C:\Program Files\JetBrains\IntelliJ IDEA 2019.2\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_144\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\rt.jar;I:\jvm\out\production\jvm-classloader" com.test.MainClass02 自己的类加载器被加载了 com.test.Test01ClassLoader@677327b6 Dog的类加载器:sun.misc.Launcher$AppClassLoader@18b4aac2 Dog 的构造函数 Process finished with exit code 0