引用:
http://frankkieviet.blogspot.in/2009/03/javalanglinkageerror-loader-constraint.html
结论:
1.类中的所有其他类型都由该类的classloader加载
2.jvm执行字节码,如下:
40: invokestatic #14 // Method com/stc/Demo$LoginEJB.login:(Lcom/stc/Demo$User;)V
这是一个method descriptor。这个descriptor中使用的每一个类型被相应的classloader加载(但是不一定在调用时一定加载,如果传递参数null,那个该类型可能不被加载。),如下例:
com/stc/Demo$LoginEJB - 调用这个方法的类的classloader(called CL1)
Lcom/stc/Demo$User; - 实际加载User的classloader(由CL1委托加载,called CL2)
那么,CL1不能在加载User,CL2不能再加载LoginEJB。(CL2能否加载LoginEJB没有实际测试过。)
但是这个method descriptor可以被整个classloader替换,如下:
com/stc/Demo$LoginEJB - 调用这个方法的类的classloader(called CL3)
Lcom/stc/Demo$User; - 实际加载User的classloader(由CL1委托加载,called CL4)
仍然,CL3不能在加载User,CL4不能再加载LoginEJB。