Bootstrap CL
└──Extension CL
└──System CL
└──User-defined CL.(classLoaderA)
└──User-defined CL.(classLoaderB)
2.Bootstrap CL负责载入core Java API class;Extension CL负责载入系统所安装的扩展Java函数库;System CL负责载入Classpath下的class。
3.Class的载入采用的是Delegation的模式,即:当系统向一个CL请求载入某一个class的时候,该CL把请求delegate给他的parent,如果parent返回相应的class,则CL返回parent所返回的class,如果parent返回null的话,则CL自己负责载入请求的class。(weblogic的classloader architecture有一个开关,当你disable那个开关的时候,child CL将不会delegate class-loading到他的parent,这是一个例外)
4.拿你说的那种情况来说,当client向classloaderB请求载入A的时候,classloaderB将会delegate这个请求给classloaderA,既然classloaderA可以返回A,那么classloaderB将会直接返回这个A给client。
试想想,小孩可以指定她的生母是A,而不是B吗?当一个孩子被生下来之后,她的生母是没有办法改变的。
同样的道理,一个class被load到JVM中以后,它肯定是被某一classloader载入的,它也没有办法改变它的生母,它有违现实逻辑。
另外,classloader architecture是java language security实现的一大基石,如果允许更改一个class所属的classloader将使得java security的大厦轰然倒塌。
ClassLoaderA cla = new ClassLoaderA();
Class cl = cla.loadClass("ClassA",true);
ClassA a = (ClassA)cl.newInstance();
而后是 User ClassLoader,如果A在System ClassLoader中被装载
那么在User ClassLoader中就应该不会被第二次装载