java 命名空間 命名規(guī)則第1/2頁(yè)
更新時(shí)間:2008年01月30日 20:55:09 作者:
java 命名空間 命名規(guī)則
摘要
Java的類裝載器是Java動(dòng)態(tài)性的核心,本文將向大家簡(jiǎn)要介紹Java的類裝載器,及相關(guān)的parent delegation模型,命名空間,運(yùn)行時(shí)包等概念,同時(shí)討論一些在學(xué)習(xí)中容易混淆的問(wèn)題。
類裝載器的功能及分類
顧名思義,類裝載器是用來(lái)把類(class)裝載進(jìn)JVM的。JVM規(guī)范定義了兩種類型的類裝載器:?jiǎn)?dòng)類裝載器(bootstrap)和用戶自定義裝載器(user-defined class loader)。
bootstrap是JVM自帶的類裝載器,用來(lái)裝載核心類庫(kù),如java.lang.*等。如java.lang.Object是由bootstrap裝載的。
Java提供了抽象類ClassLoader,所有用戶自定義類裝載器都實(shí)例化自ClassLoader的子類。 System Class Loader是一個(gè)特殊的用戶自定義類裝載器,由JVM的實(shí)現(xiàn)者提供,在編程者不特別指定裝載器的情況下默認(rèn)裝載用戶類。系統(tǒng)類裝載器可以通過(guò)ClassLoader.getSystemClassLoader() 方法得到。
例1,測(cè)試你所使用的JVM的ClassLoader
/*LoaderSample1.java*/public class LoaderSample1 { public static void main(String[] args) { Class c; ClassLoader cl;
cl = ClassLoader.getSystemClassLoader(); System.out.println(cl);
while (cl != null) { cl = cl.getParent(); System.out.println(cl); } try { c = Class.forName("java.lang.Object"); cl = c.getClassLoader(); System.out.println("java.lang.Object's loader is " + cl); c = Class.forName("LoaderSample1"); cl = c.getClassLoader(); System.out.println("LoaderSample1's loader is " + cl); } catch (Exception e) { e.printStackTrace(); } }}
在我的機(jī)器上(Sun Java 1.5)的運(yùn)行結(jié)果
C:\java>java LoaderSample1
sun.misc.Launcher$AppClassLoader@82ba41
sun.misc.Launcher$ExtClassLoader@923e30
null
java.lang.Object's loader is null
LoaderSample1's loader is sun.misc.Launcher$AppClassLoader@82ba41
第一行表示,系統(tǒng)類裝載器實(shí)例化自類sun.misc.Launcher$AppClassLoader
第二行表示,系統(tǒng)類裝載器的parent實(shí)例化自類sun.misc.Launcher$ExtClassLoader
第三行表示,系統(tǒng)類裝載器parent的parent為bootstrap
第四行表示,核心類java.lang.Object是由bootstrap裝載的
第五行表示,用戶類LoaderSample1是由系統(tǒng)類裝載器裝載的
parent delegation模型
從1.2版本開(kāi)始,Java引入了雙親委托模型,從而更好的保證Java平臺(tái)的安全。在此模型下,當(dāng)一個(gè)裝載器被請(qǐng)求裝載某個(gè)類時(shí),它首先委托自己的parent去裝載,若parent能裝載,則返回這個(gè)類所對(duì)應(yīng)的Class對(duì)象,若parent不能裝載,則由parent的請(qǐng)求者去裝載。
如圖1所示,loader2的parent為loader1,loader1的parent為system class loader。假設(shè)loader2被要求裝載類MyClass,在parent delegation模型下,loader2首先請(qǐng)求loader1代為裝載,loader1再請(qǐng)求系統(tǒng)類裝載器去裝載MyClass。若系統(tǒng)裝載器能成功裝載,則將MyClass所對(duì)應(yīng)的Class對(duì)象的reference返回給loader1,loader1再將reference返回給loader2,從而成功將類MyClass裝載進(jìn)虛擬機(jī)。若系統(tǒng)類裝載器不能裝載MyClass,loader1會(huì)嘗試裝載MyClass,若loader1也不能成功裝載,loader2會(huì)嘗試裝載。若所有的parent及l(fā)oader2本身都不能裝載,則裝載失敗。
若有一個(gè)能成功裝載,實(shí)際裝載的類裝載器被稱為定義類裝載器,所有能成功返回Class對(duì)象的裝載器(包括定義類裝載器)被稱為初始類裝載器。如圖1所示,假設(shè)loader1實(shí)際裝載了MyClass,則loader1為MyClass的定義類裝載器,loader2和loader1為MyClass的初始類裝載器。
Java的類裝載器是Java動(dòng)態(tài)性的核心,本文將向大家簡(jiǎn)要介紹Java的類裝載器,及相關(guān)的parent delegation模型,命名空間,運(yùn)行時(shí)包等概念,同時(shí)討論一些在學(xué)習(xí)中容易混淆的問(wèn)題。
類裝載器的功能及分類
顧名思義,類裝載器是用來(lái)把類(class)裝載進(jìn)JVM的。JVM規(guī)范定義了兩種類型的類裝載器:?jiǎn)?dòng)類裝載器(bootstrap)和用戶自定義裝載器(user-defined class loader)。
bootstrap是JVM自帶的類裝載器,用來(lái)裝載核心類庫(kù),如java.lang.*等。如java.lang.Object是由bootstrap裝載的。
Java提供了抽象類ClassLoader,所有用戶自定義類裝載器都實(shí)例化自ClassLoader的子類。 System Class Loader是一個(gè)特殊的用戶自定義類裝載器,由JVM的實(shí)現(xiàn)者提供,在編程者不特別指定裝載器的情況下默認(rèn)裝載用戶類。系統(tǒng)類裝載器可以通過(guò)ClassLoader.getSystemClassLoader() 方法得到。
例1,測(cè)試你所使用的JVM的ClassLoader
/*LoaderSample1.java*/public class LoaderSample1 { public static void main(String[] args) { Class c; ClassLoader cl;
cl = ClassLoader.getSystemClassLoader(); System.out.println(cl);
while (cl != null) { cl = cl.getParent(); System.out.println(cl); } try { c = Class.forName("java.lang.Object"); cl = c.getClassLoader(); System.out.println("java.lang.Object's loader is " + cl); c = Class.forName("LoaderSample1"); cl = c.getClassLoader(); System.out.println("LoaderSample1's loader is " + cl); } catch (Exception e) { e.printStackTrace(); } }}
在我的機(jī)器上(Sun Java 1.5)的運(yùn)行結(jié)果
C:\java>java LoaderSample1
sun.misc.Launcher$AppClassLoader@82ba41
sun.misc.Launcher$ExtClassLoader@923e30
null
java.lang.Object's loader is null
LoaderSample1's loader is sun.misc.Launcher$AppClassLoader@82ba41
第一行表示,系統(tǒng)類裝載器實(shí)例化自類sun.misc.Launcher$AppClassLoader
第二行表示,系統(tǒng)類裝載器的parent實(shí)例化自類sun.misc.Launcher$ExtClassLoader
第三行表示,系統(tǒng)類裝載器parent的parent為bootstrap
第四行表示,核心類java.lang.Object是由bootstrap裝載的
第五行表示,用戶類LoaderSample1是由系統(tǒng)類裝載器裝載的
parent delegation模型
從1.2版本開(kāi)始,Java引入了雙親委托模型,從而更好的保證Java平臺(tái)的安全。在此模型下,當(dāng)一個(gè)裝載器被請(qǐng)求裝載某個(gè)類時(shí),它首先委托自己的parent去裝載,若parent能裝載,則返回這個(gè)類所對(duì)應(yīng)的Class對(duì)象,若parent不能裝載,則由parent的請(qǐng)求者去裝載。
如圖1所示,loader2的parent為loader1,loader1的parent為system class loader。假設(shè)loader2被要求裝載類MyClass,在parent delegation模型下,loader2首先請(qǐng)求loader1代為裝載,loader1再請(qǐng)求系統(tǒng)類裝載器去裝載MyClass。若系統(tǒng)裝載器能成功裝載,則將MyClass所對(duì)應(yīng)的Class對(duì)象的reference返回給loader1,loader1再將reference返回給loader2,從而成功將類MyClass裝載進(jìn)虛擬機(jī)。若系統(tǒng)類裝載器不能裝載MyClass,loader1會(huì)嘗試裝載MyClass,若loader1也不能成功裝載,loader2會(huì)嘗試裝載。若所有的parent及l(fā)oader2本身都不能裝載,則裝載失敗。
若有一個(gè)能成功裝載,實(shí)際裝載的類裝載器被稱為定義類裝載器,所有能成功返回Class對(duì)象的裝載器(包括定義類裝載器)被稱為初始類裝載器。如圖1所示,假設(shè)loader1實(shí)際裝載了MyClass,則loader1為MyClass的定義類裝載器,loader2和loader1為MyClass的初始類裝載器。
相關(guān)文章
spring boot使用WebClient調(diào)用HTTP服務(wù)代碼示例
這篇文章主要介紹了spring boot使用WebClient調(diào)用HTTP服務(wù)代碼示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12詳解Java中的時(shí)區(qū)類TimeZone的用法
TimeZone可以用來(lái)獲取或者規(guī)定時(shí)區(qū),也可以用來(lái)計(jì)算時(shí)差,這里我們就來(lái)詳解Java中的時(shí)區(qū)類TimeZone的用法,特別要注意下面所提到的TimeZone相關(guān)的時(shí)間校準(zhǔn)問(wèn)題.2016-06-06Spring Boot如何通過(guò)自定義注解實(shí)現(xiàn)日志打印詳解
這篇文章主要給大家介紹了關(guān)于Spring Boot如何通過(guò)自定義注解實(shí)現(xiàn)日志打印的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10spring boot jpa寫(xiě)原生sql報(bào)Cannot resolve table錯(cuò)誤解決方法
在本篇文章里小編給大家整理的是關(guān)于spring boot jpa寫(xiě)原生sql報(bào)Cannot resolve table錯(cuò)誤的解決方法,需要的朋友學(xué)習(xí)下。2019-11-11Java設(shè)計(jì)模式之觀察者模式(Observer模式)介紹
這篇文章主要介紹了Java設(shè)計(jì)模式之觀察者模式(Observer模式)介紹,Java深入到一定程度,就不可避免的碰到設(shè)計(jì)模式(design pattern)這一概念,了解設(shè)計(jì)模式,將使自己對(duì)java中的接口或抽象類應(yīng)用有更深的理解,需要的朋友可以參考下2015-03-03logback?OutputStreamAppender高效日志輸出源碼解析
這篇文章主要介紹了為大家logback?OutputStreamAppender日志輸出效率提升示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10