ClassLoader 专题(一): ClassLoader 基础
ClassLoader 专题(二):从 Servlet 容器看 ClassLoader 机制的妙用
classloader有啥妙用(1)?
这个问题得从自定义的classloader身上说,那自定义classloader缘由是什么呢?
告诉你:大多是因为编译时无法预知运行时需要哪些类,特别是app server;因此自定义classloader,运行时指定路径,来加载这个路径下的class
特殊说明
特殊说明1:如果没有特殊指定,用户自定义的classloader都把system classloader作为它的父加载器
特殊说明2:jvm认为不同的classloade载入相同名字的class是不同的,即使从同一个class文件载入
classloader有啥妙用(2)?
看到特殊说明2,你或许就会感觉疑惑或者不爽;啥概念?
以servlet、ejb等容器来剖析这个问题:
将接口或者基类放入classpath <---------system classloader
执行时,动态载入实现或者继承这些接口或者基类的子类;<---------customized classloader
||
||
用customized classloader载入类时,发现它有一个父类class(extends);
但是在载入它时,jvm先加载父类class; 这个父类是system classloader能识别的; 根据“委托机制”它将由system classloader来加载;
然后customized classloader(实际是system classloader来加载)再载入这个class,创建一个实例,转型为父类;
jvm就使用system classloader再次载入父类class,然后将此实例转型为这个父类class;
这个过程加载了两个父类class,都是由system classloader载入;即同一个classloader载入同一个文件,造型不会由异常
web app server大概是这样工作的;这样载入了任何继承了servlet的class并正确运行它们,不管class是什么,都它们实例化为一个servlet class