java深度歷險>-閱讀筆記
每個java的安裝(Win2k),總會有很多的JRE,一定分清除到底是哪個JRE在運行
由於多個JRE和java以及Javac位置的作用,會產生很多的版本問題
java深度歷險 CH01 P36 關於Java環境的理解和設置
對Java 應用程序來說, 每個JRE 都是獨立不相干的個體。 凡是程序庫、
安全設置等與特定JRE 相關聯的特性, 如果您設置的是在A 處的JRE, 但
是執行時Java 應用程序卻是在B 處的JRE 之中執行,那麼您的設置就會完
全沒有作用。
所以, 您必須清楚地知道哪一個java.exe 被執行, 以及java.exe
到底選用到哪個JRE, 這些都是非常重要的細節。
CH02
1、關於動態加載
如C/C++本身就不具備動態性。 因此, 爲了讓這些本身不具有動態性的程序設計
語言
具有某種程度的動態性, 就必須依賴底層的操作系統提供一些機制來實現動
態性。 Windows 操作系統下的動態鏈接庫 Dynamic Linking Library 和Unix
下的共享對象 Share Object 正是這樣的例子。 但是, 要運用這些底層操作
系統所提供的機制, 程序員必須多費一些功夫來撰寫額外的程序代碼。 例如
Windows 平臺上需要使用LoadLibrary()與GetProcAddress()兩個
Win32 API 來完成動態性的需求。
2、java在本質上就是一種具有“動態性”的程序設計語言:
昨天看了Java深度歷險的ClassLoad,今天繼續
forName方法
public static Class forName(String className)(作類對象的靜態初始化)
public static Class forName(String name, boolean initialize, ClassLoader
loader)(類對象靜態初始化要看參數的)
newInstance()
getClassLoader得到ClassLoader(不作類對象的靜態初始化)
ClassLoader loader = off.getClass().getClassLoader();
Class c = loader.loadClass(args[0]);
用戶自己產生ClassLoader:URLClassLoader
當一個類被多個加載類加載的時候,會多次執行類的靜態初始化代碼(內存中存在
多個
“類”對象)
3、java執行class的整個流程
Java.exe xxx-->java.exe找到JRE(本目錄下-父目錄下-註冊表中:所以要弄清
楚java.exe的位置)-->java.exe同jre版本驗證
-->加載jvm.dll-->jvm的初始化操作(如獲取系統參數等)
-->產生第一個類裝載器:BootStrap Loader(C++寫成,Java類getClassLoader爲nu
ll,就是指它)-->基本初始化操作
-->BootStrap Loader載入sun.misc.launcher$ExtClassLoader.class(設置paren
t爲n
ull)
-->BootStrap Loader載入sun.misc.launcher$AppClassLoader.class(設置paren
t爲launcher$ExtClassLoader的object...不是null呀)
AppClassLoader被sun成爲system loader
-->由AppClassLoader 負責載入命令行中所輸入的xxx.class(實際上xxx.class
很可能由ExtClassLoader 或Bootstrap Loader 載入)
xxx.getParent()和xxx.class.getClassLoader()指向的對象很可能不相同,paren
t和裝載器之間沒有特別的關係(Parent是爲某些特殊目的而設)
除了bootStrap Loader之外,其他的類裝載器統統由java生成,也應該由其他的類
裝載器裝載
4、AppClassLoader 和ExtClassLoader 都是URLClassLoader 的子類
AppClassLoader 所引用的URL 是由從系統參數java.class.path 取出的字符串所
決定的。
而java.class.path 則是由我們在執行java.exe時, 利用–cp 或-classpath 或C
LASSPATH 環境變量所決定的。
至於ExtClassLoader 也有相同的情形, 不過其要加載類的搜索路徑是引用系統參
數java.ext.dirs(就是JRE的lib下面的ext目錄中)
系統參數java.ext.dirs 的內容可以在一開始執行命令的時候來更改:
java -Djava.ext.dirs=c:/winnt xxx
Bootstrap Loader 通過查詢系統參數sun.boot.class.path, 用來搜索要加載類的
路徑系統參數sun.boot.class.path 的內容可以在一開始執行命令的時候來更改:java -D
sun.boot.class.path=c:/winnt xxx
5、類加載等級的存在是以一個Object爲單位的。
單Object內部的所有類加載,要遵循從加載本類的裝載器開始的一個等級,
在此等級內,如果無法找到本Object內的類,就Exception了,
否則就按照先上再下的方式查詢匹配
6、ClassLoader的加載等級,就是委託加載,一是爲了動態加載,二是保證程序安全:
(CH02 90)
第一, 假設我們利用URLClassLoader 到網絡上的任何地方下載了其它的類, URLCl
assLoader 都不可能下載
Java AppClassLoader, ExtClassLoader 或者Bootstrap Loader 可以找到的
同名類, 指全名, 程序包名稱+類名稱,, 因此, 蓄意破壞者根本沒有機會
植入有問題的程序代碼於我們的計算機之中, 除非蓄意破壞者能潛入您的
計算機, 置換掉您計算機內的類文件, 但是這已經不是Java 所涉及的安全
問題了, 而是操作系統本身的安全問題,;
第二, 類裝載器無法看到其它相同階層之類裝載器所載入的類, 如上圖所示, 圖中
虛線框起來的部分意指
www.sun.com 下載程序代碼的類裝載器所能看到的類, 這告訴我們, 從
www.sun.com 載入的類無法看www.xxx.com 載入的類, 除了意味着不
同的類裝載器可以載入完全相同的類之外, 也排除了誤用或惡意使用別人
程序代碼的機會,
由於多個JRE和java以及Javac位置的作用,會產生很多的版本問題
java深度歷險 CH01 P36 關於Java環境的理解和設置
對Java 應用程序來說, 每個JRE 都是獨立不相干的個體。 凡是程序庫、
安全設置等與特定JRE 相關聯的特性, 如果您設置的是在A 處的JRE, 但
是執行時Java 應用程序卻是在B 處的JRE 之中執行,那麼您的設置就會完
全沒有作用。
所以, 您必須清楚地知道哪一個java.exe 被執行, 以及java.exe
到底選用到哪個JRE, 這些都是非常重要的細節。
CH02
1、關於動態加載
如C/C++本身就不具備動態性。 因此, 爲了讓這些本身不具有動態性的程序設計
語言
具有某種程度的動態性, 就必須依賴底層的操作系統提供一些機制來實現動
態性。 Windows 操作系統下的動態鏈接庫 Dynamic Linking Library 和Unix
下的共享對象 Share Object 正是這樣的例子。 但是, 要運用這些底層操作
系統所提供的機制, 程序員必須多費一些功夫來撰寫額外的程序代碼。 例如
Windows 平臺上需要使用LoadLibrary()與GetProcAddress()兩個
Win32 API 來完成動態性的需求。
2、java在本質上就是一種具有“動態性”的程序設計語言:
昨天看了Java深度歷險的ClassLoad,今天繼續
forName方法
public static Class forName(String className)(作類對象的靜態初始化)
public static Class forName(String name, boolean initialize, ClassLoader
loader)(類對象靜態初始化要看參數的)
newInstance()
getClassLoader得到ClassLoader(不作類對象的靜態初始化)
ClassLoader loader = off.getClass().getClassLoader();
Class c = loader.loadClass(args[0]);
用戶自己產生ClassLoader:URLClassLoader
當一個類被多個加載類加載的時候,會多次執行類的靜態初始化代碼(內存中存在
多個
“類”對象)
3、java執行class的整個流程
Java.exe xxx-->java.exe找到JRE(本目錄下-父目錄下-註冊表中:所以要弄清
楚java.exe的位置)-->java.exe同jre版本驗證
-->加載jvm.dll-->jvm的初始化操作(如獲取系統參數等)
-->產生第一個類裝載器:BootStrap Loader(C++寫成,Java類getClassLoader爲nu
ll,就是指它)-->基本初始化操作
-->BootStrap Loader載入sun.misc.launcher$ExtClassLoader.class(設置paren
t爲n
ull)
-->BootStrap Loader載入sun.misc.launcher$AppClassLoader.class(設置paren
t爲launcher$ExtClassLoader的object...不是null呀)
AppClassLoader被sun成爲system loader
-->由AppClassLoader 負責載入命令行中所輸入的xxx.class(實際上xxx.class
很可能由ExtClassLoader 或Bootstrap Loader 載入)
xxx.getParent()和xxx.class.getClassLoader()指向的對象很可能不相同,paren
t和裝載器之間沒有特別的關係(Parent是爲某些特殊目的而設)
除了bootStrap Loader之外,其他的類裝載器統統由java生成,也應該由其他的類
裝載器裝載
4、AppClassLoader 和ExtClassLoader 都是URLClassLoader 的子類
AppClassLoader 所引用的URL 是由從系統參數java.class.path 取出的字符串所
決定的。
而java.class.path 則是由我們在執行java.exe時, 利用–cp 或-classpath 或C
LASSPATH 環境變量所決定的。
至於ExtClassLoader 也有相同的情形, 不過其要加載類的搜索路徑是引用系統參
數java.ext.dirs(就是JRE的lib下面的ext目錄中)
系統參數java.ext.dirs 的內容可以在一開始執行命令的時候來更改:
java -Djava.ext.dirs=c:/winnt xxx
Bootstrap Loader 通過查詢系統參數sun.boot.class.path, 用來搜索要加載類的
路徑系統參數sun.boot.class.path 的內容可以在一開始執行命令的時候來更改:java -D
sun.boot.class.path=c:/winnt xxx
5、類加載等級的存在是以一個Object爲單位的。
單Object內部的所有類加載,要遵循從加載本類的裝載器開始的一個等級,
在此等級內,如果無法找到本Object內的類,就Exception了,
否則就按照先上再下的方式查詢匹配
6、ClassLoader的加載等級,就是委託加載,一是爲了動態加載,二是保證程序安全:
(CH02 90)
第一, 假設我們利用URLClassLoader 到網絡上的任何地方下載了其它的類, URLCl
assLoader 都不可能下載
Java AppClassLoader, ExtClassLoader 或者Bootstrap Loader 可以找到的
同名類, 指全名, 程序包名稱+類名稱,, 因此, 蓄意破壞者根本沒有機會
植入有問題的程序代碼於我們的計算機之中, 除非蓄意破壞者能潛入您的
計算機, 置換掉您計算機內的類文件, 但是這已經不是Java 所涉及的安全
問題了, 而是操作系統本身的安全問題,;
第二, 類裝載器無法看到其它相同階層之類裝載器所載入的類, 如上圖所示, 圖中
虛線框起來的部分意指
www.sun.com 下載程序代碼的類裝載器所能看到的類, 這告訴我們, 從
www.sun.com 載入的類無法看www.xxx.com 載入的類, 除了意味着不
同的類裝載器可以載入完全相同的類之外, 也排除了誤用或惡意使用別人
程序代碼的機會,
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.