擴展類加載器獨有的特點,代碼如下
public class Sample {
}
public class Test {
static {
System.out.println("Test static block");
}
public static void main(String[] args) {
System.out.println(Test.class.getClassLoader());
System.out.println(Sample.class.getClassLoader());
}
}
在控制台運行,結果如下
D:\workspace-learn\common-learn\learn-jvm\target\classes>java -Djava.ext.dirs=./ com.learn.jvm.loader.Test Test static block sun.misc.Launcher$AppClassLoader@334dcfad sun.misc.Launcher$AppClassLoader@334dcfad
可以看到,即使我們已經通過 -Djava.ext.dirs=./ 指定了擴展類加載器的加載路徑,並且在該路徑下能夠找到Test類和Sample類,但是運行結果表明這兩個類依然是由系統類加載器所加載的。
這是因為擴展類加載器只加載jar包
通過以下命令對Sample.class進行打包
jar cvf Sample.jar ./com/learn/jvm/loader/Sample.class
然后再次運行,結果如下
D:\workspace-learn\common-learn\learn-jvm\target\classes>java -Djava.ext.dirs=./ com.learn.jvm.loader.Test Test static block sun.misc.Launcher$AppClassLoader@397d812b sun.misc.Launcher$ExtClassLoader@5eab4b89
可以看出,這次Sample類正常加載了
