java 命名空間 命名規(guī)則
更新時(shí)間:2008年01月30日 20:55:09 作者:
java 命名空間 命名規(guī)則
圖 1 parent delegation模型
需要指出的是,Class Loader是對(duì)象,它的父子關(guān)系和類的父子關(guān)系沒有任何關(guān)系。一對(duì)父子loader可能實(shí)例化自同一個(gè)Class,也可能不是,甚至父loader實(shí)例化自子類,子loader實(shí)例化自父類。假設(shè)MyClassLoader繼承自ParentClassLoader,我們可以有如下父子loader:
ClassLoader loader1 = new MyClassLoader();
//參數(shù) loader1 為 parent
ClassLoader loader2 = new ParentClassLoader(loader1);
那么parent delegation模型為什么更安全了?因?yàn)樵诖四P拖掠脩糇远x的類裝載器不可能裝載應(yīng)該由父親裝載器裝載的可靠類,從而防止不可靠甚至惡意的代碼代替由父親裝載器裝載的可靠代碼。實(shí)際上,類裝載器的編寫者可以自由選擇不用把請(qǐng)求委托給parent,但正如上所說,會(huì)帶來(lái)安全的問題。
命名空間及其作用
每個(gè)類裝載器有自己的命名空間,命名空間由所有以此裝載器為初始類裝載器的類組成。不同命名空間的兩個(gè)類是不可見的,但只要得到類所對(duì)應(yīng)的Class對(duì)象的reference,還是可以訪問另一命名空間的類。
例2演示了一個(gè)命名空間的類如何使用另一命名空間的類。在例子中,LoaderSample2由系統(tǒng)類裝載器裝載,LoaderSample3由自定義的裝載器loader負(fù)責(zé)裝載,兩個(gè)類不在同一命名空間,但LoaderSample2得到了LoaderSample3所對(duì)應(yīng)的Class對(duì)象的reference,所以它可以訪問LoaderSampl3中公共的成員(如age)。
例2 不同命名空間的類的訪問
/*LoaderSample2.java*/import java.net.*;import java.lang.reflect.*;public class LoaderSample2 { public static void main(String[] args) { try { String path = System.getProperty("user.dir"); URL[] us = {new URL("file://" + path + "/sub/")}; ClassLoader loader = new URLClassLoader(us); Class c = loader.loadClass("LoaderSample3"); Object o = c.newInstance(); Field f = c.getField("age"); int age = f.getInt(o); System.out.println("age is " + age); } catch (Exception e) { e.printStackTrace(); } }
}
/*sub/Loadersample3.java*/public class LoaderSample3 { static { System.out.println("LoaderSample3 loaded"); } public int age = 30;}
編譯:
javac LoaderSample2.java;
javac sub/LoaderSample3.java
運(yùn)行:java LoaderSample2
LoaderSample3 loaded
age is 30
從運(yùn)行結(jié)果中可以看出,在類LoaderSample2中可以創(chuàng)建處于另一命名空間的類LoaderSample3中的對(duì)象并可以訪問其公共成員age。
運(yùn)行時(shí)包(runtime package)
由同一類裝載器定義裝載的屬于相同包的類組成了運(yùn)行時(shí)包,決定兩個(gè)類是不是屬于同一個(gè)運(yùn)行時(shí)包,不僅要看它們的包名是否相同,還要看類裝載器是否相同。只有屬于同一運(yùn)行時(shí)包的類才能互相訪問包可見的類和成員。這樣的限制避免了用戶自己的代碼冒充核心類庫(kù)的類訪問核心類庫(kù)包可見成員的情況。假設(shè)用戶自己定義了一個(gè)類java.lang.Yes,并用用戶自定義的類裝載器裝載,由于java.lang.Yes和核心類庫(kù)java.lang.*由不同的裝載器裝載,它們屬于不同的運(yùn)行時(shí)包,所以java.lang.Yes不能訪問核心類庫(kù)java.lang中類的包可見的成員。
總結(jié)
在簡(jiǎn)單討論了類裝載器,parent delegation模型,命名空間,運(yùn)行時(shí)包后,相信大家已經(jīng)對(duì)它們的作用有了一定的了解。命名空間并沒有完全禁止屬于不同空間的類的互相訪問,雙親委托模型加強(qiáng)了Java的安全,運(yùn)行時(shí)包增加了對(duì)包可見成員的保護(hù)。
相關(guān)文章
SpringBoot使用Spring-Data-Jpa實(shí)現(xiàn)CRUD操作
這篇文章主要為大家詳細(xì)介紹了SpringBoot使用Spring-Data-Jpa實(shí)現(xiàn)CRUD操作,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08
Java基礎(chǔ)之淺談hashCode()和equals()
今天給大家?guī)?lái)的是關(guān)于Java基礎(chǔ)的相關(guān)知識(shí),文章圍繞著hashCode()和equals()展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06
Java實(shí)現(xiàn)Excel導(dǎo)入導(dǎo)出數(shù)據(jù)庫(kù)的方法示例
這篇文章主要介紹了Java實(shí)現(xiàn)Excel導(dǎo)入導(dǎo)出數(shù)據(jù)庫(kù)的方法,結(jié)合實(shí)例形式分析了java針對(duì)Excel的讀寫及數(shù)據(jù)庫(kù)操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-08-08
Intellij IDEA實(shí)現(xiàn)SpringBoot項(xiàng)目多端口啟動(dòng)的兩種方法
有時(shí)候使用springboot項(xiàng)目時(shí)遇到這樣一種情況,用一個(gè)項(xiàng)目需要復(fù)制很多遍進(jìn)行測(cè)試,除了端口號(hào)不同以外,沒有任何不同。遇到這種情況怎么辦呢?這時(shí)候可以使用Intellij IDEA解決2018-06-06
java注釋轉(zhuǎn)json插件開發(fā)實(shí)戰(zhàn)詳解
這篇文章主要為大家介紹了java注釋轉(zhuǎn)json插件開發(fā)實(shí)戰(zhàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
2023-06-06 
