轉(zhuǎn)帖|其它|編輯:郝浩|2010-05-27 13:55:36.000|閱讀 782 次
概述:java動(dòng)態(tài)載入的時(shí)候需要考慮到安全因素,這個(gè)問題就是我們必須解決的問題。下面我們就看看如何才能更好的解決相關(guān)安全上面的問題。希望大家從中吸取相關(guān)的知識。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
java動(dòng)態(tài)載入的時(shí)候需要考慮到安全因素,這個(gè)問題就是我們必須解決的問題。下面我們就看看如何才能更好的解決相關(guān)安全上面的問題。希望大家從中吸取相關(guān)的知識。
我們試想一下,如果不使用這種委托模式,那我們就可以隨時(shí)使用自定義的String來動(dòng)態(tài)替代java核心api中定義類型,這樣會存在非常大的安全隱患,而雙親委托的方式,就可以避免這種情況,因?yàn)镾tring已經(jīng)在啟動(dòng)時(shí)被加載,所以用戶自定義類是無法加載一個(gè)自定義的ClassLoader。
java動(dòng)態(tài)載入class的兩種方式:
implicit隱式,即利用實(shí)例化才載入的特性來java動(dòng)態(tài)載入class
explicit顯式方式,又分兩種方式:
java.lang.Class的forName()方法
java.lang.ClassLoader的loadClass()方法
用Class.forName加載類
Class.forName使用的是被調(diào)用者的類加載器來加載類的。
這種特性, 證明了java類加載器中的名稱空間是唯一的, 不會相互干擾。
即在一般情況下, 保證同一個(gè)類中所關(guān)聯(lián)的其他類都是由當(dāng)前類的類加載器所加載的。
1.public static Class forName(String className) 2.throws ClassNotFoundException { 3.return forName0(className, true , ClassLoader.getCallerClassLoader()); 4.} 5./** Called after security checks have been made. */ 6.private static native Class forName0(String name, boolean initialize, 7.ClassLoader loader) 8.throws ClassNotFoundException; |
Java代碼
9.public static Class forName(String className) 10.throws ClassNotFoundException { 11.return forName0(className, true , ClassLoader.getCallerClassLoader()); 12.} 13./** Called after security checks have been made. */ 14.private static native Class forName0(String name, boolean initialize, 15.ClassLoader loader) 16.throws ClassNotFoundException; |
上面中 ClassLoader.getCallerClassLoader 就是得到調(diào)用當(dāng)前forName方法的類的類加載器
static塊在什么時(shí)候執(zhí)行?
當(dāng)調(diào)用forName(String)載入class時(shí)執(zhí)行,如果調(diào)用ClassLoader.loadClass并不會執(zhí)行.forName(String,false,ClassLoader)時(shí)也不會執(zhí)行,如果載入Class時(shí)沒有執(zhí)行static塊則在第一次實(shí)例化時(shí)執(zhí)行.比如new ,Class.newInstance()操作static塊僅執(zhí)行一次,各個(gè)java類由哪些classLoader加載?
java類可以通過實(shí)例.getClass.getClassLoader()得知
接口由AppClassLoader(System ClassLoader,可以由ClassLoader.getSystemClassLoader()獲得實(shí)例)載入
ClassLoader類由bootstrap loader載入
NoClassDefFoundError和ClassNotFoundException
NoClassDefFoundError:當(dāng)java源文件已編譯成.class文件,但是ClassLoader在運(yùn)行期間在其搜尋路徑load某個(gè)類時(shí),沒有找到.class文件則報(bào)這個(gè)錯(cuò)
ClassNotFoundException:試圖通過一個(gè)String變量來創(chuàng)建一個(gè)Class類時(shí)不成功則拋出這個(gè)異常,以上就是對java動(dòng)態(tài)載入的詳細(xì)介紹。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@ke049m.cn
文章轉(zhuǎn)載自:網(wǎng)絡(luò)轉(zhuǎn)載