一个程序有一个默认的appClassLoader。类不是由被调用者也不是被自身加载的,正常情况下是被默认的AppClassLoader加载的。
System.out.println(test3.class.getClassLoader()); System.out.println(test4.class.getClassLoader()); System.out.println(test5.class.getClassLoader()); ClassLoader appClassLoader = ClassLoader.getSystemClassLoader(); System.out.println("the appClassLoader : " + appClassLoader);
appClassLoader是同一个对象。
类总是由appClassLoader的父类的父类加载,如果加载失败由父类加载,如果再失败由它本身加载,也就是双亲加载机制。这是有一定的目的的。
appClassLoader的父类的父类,即BootstrapClassLoader(启动类加载器),只加载某些路径下的类。
appClassLoader的父类,ExtClassLoader (标准扩展类加载器),也只加载某些路径下的类。
appClassLoader,系统类加载器,也只加载某些路径下的类。这个路径就是class path配的地址。这些路径下不能保证类只出现一次,以我测试看,是先找到哪个就加载哪个。
网上的好多文章都缺点什么,让人更晕。classloader,双亲委派知识的关键是一个程序只有一个appClassLoader,类基本上都是由它加载的。
****************************************
tomcat实现了自定义的classloader来实现不同webapp的隔离。
System.out.println(test.class.getClassLoader()); System.out.println(this); ClassLoader appClassLoader = ClassLoader.getSystemClassLoader(); System.out.println("the appClassLoader : " + appClassLoader);
在不同的webapp里,classloader不一样,servlet对象也不一样。
通过这些知识也得出自己的webapp的类库放在自己webapp的lib库里比较合理,不要放到tomcat的类库中,classpath变量也慎用,classpath的值在catlinet.bat中会被初始化。