ClassLoader專(zhuān)題(二):從Servlet容器看ClassLoader機(jī)制的妙用
ClassLoader 專(zhuān)題(一): ClassLoader 基礎(chǔ)
ClassLoader 專(zhuān)題(二):從 Servlet 容器看 ClassLoader 機(jī)制的妙用
ClassLoader專(zhuān)題(三):引文
classloader有啥妙用(1)?
這個(gè)問(wèn)題得從自定義的classloader身上說(shuō),那自定義classloader緣由是什么呢?
告訴你:大多是因?yàn)榫幾g時(shí)無(wú)法預(yù)知運(yùn)行時(shí)需要哪些類(lèi),特別是app server;因此自定義classloader,運(yùn)行時(shí)指定路徑,來(lái)加載這個(gè)路徑下的class
特殊說(shuō)明
特殊說(shuō)明1:如果沒(méi)有特殊指定,用戶(hù)自定義的classloader都把system classloader作為它的父加載器
特殊說(shuō)明2:jvm認(rèn)為不同的classloade載入相同名字的class是不同的,即使從同一個(gè)class文件載入
classloader有啥妙用(2)?
看到特殊說(shuō)明2,你或許就會(huì)感覺(jué)疑惑或者不爽;啥概念?
以servlet、ejb等容器來(lái)剖析這個(gè)問(wèn)題:
將接口或者基類(lèi)放入classpath <---------system classloader
執(zhí)行時(shí),動(dòng)態(tài)載入實(shí)現(xiàn)或者繼承這些接口或者基類(lèi)的子類(lèi);<---------customized classloader
||
||
用customized classloader載入類(lèi)時(shí),發(fā)現(xiàn)它有一個(gè)父類(lèi)class(extends);
但是在載入它時(shí),jvm先加載父類(lèi)class; 這個(gè)父類(lèi)是system classloader能識(shí)別的; 根據(jù)“委托機(jī)制”它將由system classloader來(lái)加載;
然后customized classloader(實(shí)際是system classloader來(lái)加載)再載入這個(gè)class,創(chuàng)建一個(gè)實(shí)例,轉(zhuǎn)型為父類(lèi);
jvm就使用system classloader再次載入父類(lèi)class,然后將此實(shí)例轉(zhuǎn)型為這個(gè)父類(lèi)class;
這個(gè)過(guò)程加載了兩個(gè)父類(lèi)class,都是由system classloader載入;即同一個(gè)classloader載入同一個(gè)文件,造型不會(huì)由異常
web app server大概是這樣工作的;這樣載入了任何繼承了servlet的class并正確運(yùn)行它們,不管class是什么,都它們實(shí)例化為一個(gè)servlet class
posted on 2006-11-24 22:20 crazycy 閱讀(3511) 評(píng)論(7) 編輯 收藏 所屬分類(lèi): JavaSE語(yǔ)言