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