JVM的classLoader体系-2
?? ?在“JVM的classLoader体系-1”,总结了jvm的classloader一些基本的内容,肯定有很多不足的地方,还请大家指点,现在对jvm类加载机制进行一下测试:1.建立测试文件Main.java和Test.java
Main.java:(负责打印出Main.java和Test.java的类加载器)
?
??? Test? at Main.main(Main.java:8)3.2测试02-测试结果分析由于Bootstrap?ClassLoader下面有Main.class,所以由Bootstrap?ClassLoader负责加载Main.class,在默认的情况下,Main.class所引用的类将由Bootstrap加载,由于Bootstrap所加载的目录下的Test.class被删除了,所以出来NoClassDefFoundError的现象
3.3测试03-文件存放的位置?Javasource目录下:?Main.class?Test.class?Jdk\jre\ib\ext\classes目录下:?Main.class?Test.class?Jdk\jre\classes目录下:?Test.class3.3测试03-测试结果?Main'sclassLoader issun.misc.Launcher$ExtClassLoader@126b249
?Test'sclassLoader is null3.3测试03-测试结果分析Main.class由ExtClassLoader加载,在默认的情况下,Test.class也应该由ExtClassLoader加载,ExtClassLoader首先委派其父类BootstrapClassLoader加载,由于Bootstrap所加载文件下有Test.class,所以由Bootstrap负责加载Test.class
3.4测试04-文件存放的位置?Javasource目录下:
?Main.class?Test.class?Jdk\jre\ib\ext\classes目录下:?Main.class?Test.class?Jdk\jre\classes目录下:3.4测试04-测试结果?
?Main'sclassLoader issun.misc.Launcher$ExtClassLoader@182f0db?Test'sclassLoader issun.misc.Launcher$ExtClassLoader@182f0db3.4测试04-测试结果分析思路如测试013.5测试05-文件存放的位置?Javasource目录下:
?Main.class?Test.class?Jdk\jre\ib\ext\classes目录下:?Main.class?Jdk\jre\classes目录下:3.5测试05-测试结果?
Main'sclassLoader issun.misc.Launcher$ExtClassLoader@126b249Test'sclassLoader is Exception in thread"main" java.lang.NoClassDefFoundError:?Test
??????? at Main.main(Main.java:8)
Caused by: java.lang.ClassNotFoundException: Test
??????? atjava.net.URLClassLoader$1.run(URLClassLoader.java:202)
??????? at java.security.AccessController.doPrivileged(Native Method)
??????? at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
??????? at sun.misc.Launcher$ExtClassLoader.findClass(Launcher.java:229)
??????? at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
??????? at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
??????? ... 1 more
3.5测试05-测试结果分析思路如测试02
3.6测试06-文件存放的位置?Javasource目录下:
?Main.class?Test.class?Jdk\jre\ib\ext\classes目录下:?Test.class?Jdk\jre\classes目录下:3.6测试06-测试结果?Main'sclassLoader issun.misc.Launcher$AppClassLoader@ad3ba4?Test'sclassLoader issun.misc.Launcher$ExtClassLoader@126b2493.6测试06-测试结果分析思路如测试03
4.总结1.从测试结果中可以看出,类加载器在加载应用程序的class文件时,首先委托其父类进行加载,在父类加载失败的情况下,从由自己去加载。
2.在默认情况下,类A引用类B,那么类B的加载由类A的加载器或者类A加载器的父类来完成
?
?
?
?
1 楼 dingherry 2011-04-17 很好的学习方案,by the way,LZ在看什么书呢?深入java虚拟机 吗? 2 楼 songkewei110 2011-04-17 dingherry 写道很好的学习方案,by the way,LZ在看什么书呢?深入java虚拟机 吗?
在看“深入java虚拟机”,看的一知半解,慢慢啃吧