jvm里有多个类加载,每个类加载可以负责加载特定位置的类,
例如,bootstrap类加载负责加载jre/lib/rt.jar中的类, 我们平时用的jdk中的类都位于rt.jar中。
extclassloader负责加载jar/lib/ext/*.jar中的类,
appclassloader负责classpath指定的目录或jar中的类。
除了bootstrap之外,其他的类加载器本身也都是java类,它们的父类是ClassLoader。
下面是演示的代码,运行出结果,很直观的就能观察到他们的关系
public class ClassLoaderBiji {
public static void main(String[] args) {
System.out.println(ClassLoaderBiji.class.getClassLoader()
.getClass().getName());
System.out.println(System.class.getClassLoader());
/**通过打印,了解3个加载器的继承关系
* 先拿到一个类加载器,然后打印出它的名字,
* 然后再拿到父类的加载器,继续打印出名字。
* */
ClassLoader loader = ClassLoaderBiji.class.getClassLoader();
while(loader != null) {
System.out.println(loader.getClass().getName());
loader = loader.getParent();
}
System.out.println(loader);
}
}
希望可以帮到你 |