一个程序有一个默认的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中会被初始化。

 

posted on 2021-09-15 11:31  北上  阅读(169)  评论(0编辑  收藏  举报