据说
bootstrap类加载器加载位于
<JAVA_HOME>
/ jre / lib目录中的核心Java库。
并且
扩展类加载器加载扩展目录
<JAVA_HOME>
/ jre / lib / ext或java.ext.dirs系统属性指定的任何其他目录中的代码。它由sun.misc.Launcher $ ExtClassLoader类实现。
现在,如果我的主程序是
public class TestSt {
public static void main(String[] args) {
System.out.println(String.class.getClassLoader());
System.out.println(Student.class.getClassLoader());
System.out.println(TestSt.class.getClassLoader());
}
}
输出
空
sun.misc.Launcher$AppClassLoader@73d16e93 sun.misc.Launcher$AppClassLoader@73d16e93
哪个好。
现在如果我把Student Jar文件放在/ jre / lib / ext中输出是
空
sun.misc.Launcher$ExtClassLoader@3d4eac69 sun.misc.Launcher$AppClassLoader@2a139a55
哪个也没关系。
但是如果我将学生jar文件放在中,我无法理解 / jre / lib目录。为什么输出为
空
sun.misc.Launcher$AppClassLoader@73d16e93 sun.misc.Launcher$AppClassLoader@73d16e93
我在想这个案例中的Student Class应该从bootstrap类加载器加载,为什么它由应用程序类加载器加载。我想我错过了什么。请让我知道我错在哪里。
答案 0 :(得分:2)
只有少数目录可以自动加载所有JAR。在诸如/jre/lib
的目录中,仅加载它期望加载的JAR。任何其他JAR都需要通过类路径加载。