引用:
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。