浏览 3742 次
锁定老帖子 主题:<<Java深度历险>>学习
该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2006-12-06
以下说不上学习笔记,基本上照抄 第一章 深入Java2 SDK JDK(Java 開發套件)、JRE(Java執行環境,Java Runtime Environment)、還有JVM(Java 虛擬機器,JavaVirtual Machine)三者之間的關係。Java 虛擬機器只是JRE 裡頭的其中一個成員 而已,以更技術的角度來說,Java 虛擬機器只是JRE 裡頭的一個動態聯結函式庫罷了。 JDK 裡面的工具幾乎是用Java 所撰寫的,所以JDK 本身就是Java 應用程式,因此要使用JDK 附的工具來開發Java 程式,也必須要自行附一套JRE 才行,這就是<jdk 安裝目錄>\jre 底下需要一套JRE 的原因。而位於 Program File\底下的那套JRE 就是拿來執行我們自己所撰 寫的Java 應用程式 javac.exe只是一個包裝器(wrapper),而製作目的是為了讓開發者免於輸入太長的指令,javac 可以隐式编译一些没有在命令行中提及的源文件。用 -verbose 选项可跟踪自动编译 java.exe 依照底下邏輯來尋找JRE: 1. 自己的目錄下有沒有JRE 目錄。(這個部分這樣說並不是非常精確,原因 請詳見JDK 原始碼,這此不特別說明) 2. 父目錄底下JRE 子目錄。 3. 查詢Windows Registry(HKEY_LOCAL_MACHINE\Software\JavaSoft\Java Runtime Environment\)。java.exe 的工作就是找到合適的JRE 來執行類別檔 java.exe 在c:\winnt\system32 底下找不到JRE 目錄,在c:\winnt也找不到JRE 目錄的情況下,根據下一個邏輯,就是去查詢Windows Registry 當您在開發Java 程式或是執行Java 程式的時候,一定要記得兩件事: 1. 那一個java.exe 被執行。 2. java.exe 找到哪一套JRE。 现在我有个问题还模糊,javac.exe 和java.exe到底有什么区别? javac是不是只是根据环境变量的设置,自动寻找到jdk里面的jre下面的java.exe,然后java.exe再调用 (插播java -classpath d:\j2sdk1.4.0\lib\tools.jar com.sun.tools.javac.Main)相关类执行编译功能,就正如前面所说的javac.exe只是个wrapper,“封装“了java -classpath d:\j2sdk1.4.0\lib\tools.jar com.sun.tools.javac.Main 所以可以只用java.exe就可以编译+执行了 不知道这里理解对么? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2006-12-06
第二章 深入类别载入器
1,静态初始块是在类别第一次实体化的时候才被呼叫那仅仅一次 不管使用的是new来产生类别的实体,或是只有一个参数的forname()方法,内部都隐含了 “再如类别+呼叫静态初始化区块”的动作,而使用具有3个参数的forname(),方法时,如 第二个参数设定为false,那么就只命令类别载入器载入该类别,但不会叫用其静态初始化 区块,只有等到整个程式第一次实体化某个类别时,静态初始化区块才会别叫用。 2, 显式的方法:直接使用类别载入器帮我们载入类别,首先必须取得类别载入器的参考,而 这之前我们还需要取得某物价所属的类别,在java中的老祖宗Object里有个getClass()的 方法,就是用来取得特定实体所属类别的参考,这个参考指向的是一个名为Class类别 (Class.class)的实体,但我们无法自行产生一个Class类别的实体,因为它被宣告程 private,这Class类别的实体是在类别档(.class)第一次载入内存时建立,在以后我 们程序产生任何类别,这些实体内部都会有标位记录着这个Class的位置,我们可以把每个Class的类别的实体,当作某个类别在记忆体的代理人,故我们查询该类别的资料时,可以 请这个实体帮我们代劳,java 的Reflection机制大量用到Class类别,该类别的定义大量 用 native method在java中,每个类别都是由某个类别载入器(ClassLoader的实体)来载入,系统里同时存 多个在ClassLoader的实体,而且一个类别载入器不限只能载入一个类别,类别载入器可以 多个载入类别,所以我们可以利用getClassLoader()方法取得载入该类别之类别载入器的参 考,取得了ClassLoader的实体,我们就可以叫用其loadClass()方法帮助我们再如我们想 要的类别 例如 public class Office { public static void main(String args[]) throws Exception { Office off = new Office() ;//右边可换成Office.class,结果一样 System.out.println("類別準備載入") ; ClassLoader loader = off.getClass().getClassLoader() ; Class c = loader.loadClass(args[0]) ; System.out.println("類別準備實體化") ; Object o = c.newInstance() ; Object o2 = c.newInstance() ; } } 直接使用ClassLoader类别的loadClass()方法载入类别,只会载入记忆体(应该就是内存 吧),必须等到第一次实例化该类别时才被调用,其方法类似于使用Class 類別的 forName()方法時,第二個參數傳入false的情况 3, 自己建立类别载入器载入,利用Java 本身提供的java.net.URLClassLoader 類別就可以做 到,只需告訴URLClassLoader我们需要载入类的路径就卡一了。妈的累死了,不写了,反 正也是抄。。。 4, 类别载入期的阶层关系 java xxx.class-->jre--->jvm.dll 虚拟机动作完成后,产生第一个类别载入器Bootstrap Loader(此东西由c++编写,故以 java的观点,逻辑上不存在这样的实体 )先后载入ExtClassLoader和AppClassLoader 注意注意:Launcher$ExtClassLoader.class 與 Launcher$AppClassLoader.class 都是由Bootstrap Loader 所載入,所以Parent 和由哪個類別載入器載入沒有關係,分别 设定ExtClassLoader的parent为null,Bootstrap Loader的Parent为為之前產生的 ExtClassLoader 實体,故并不是我们平常所理解的父子关系。 這個由Bootstrap Loader--->ExtClassLoader--->AppClassLoader,就是我們所謂「類 別載入器的階層體系」。 AppClassLoader 的搜尋路徑為”.”(目前所在目錄),如果使用-classpath 選項(與-cp 等效),就可以改變AppClassLoader 的搜尋路徑,如果沒有指定-classpath 選項,就會搜 尋環境變數CLASSPATH。如果同時有CLASSPATH 的環境設定與-classpath 選項,則 以-classpath 選項的內容為主,CLASSPATH 的環境設定與-classpath 選項兩者的內容不 會有加成的效果 AppClassLoader 完全不受系統參數java.class.path 的更改而產生影響 5, 委派模型 哈哈,这个不错在javaeye上有看过(http://www.iteye.com/article/14479),意思是 类别载入器有载入类别的需求时,会先请示其 Parent使用其搜寻路径帮忙载入,如果 Parent找不到,那没才由自己依照自己的搜寻路径搜寻类别,不太符合一般OO意义上的父子 关系(儿子可以override父亲,儿子不行了才去找老爸) 在Java 領域中只要分成API(Application Programming公開制定,會成為核心類別函式庫( 由Bootstrap Loader 載入)或擴充類別函式庫(由ExtClassLoader 載入))與SPI(Service Provide Interface,由 特定廠商撰寫,會成為擴充類別函式庫(由ExtClassLoader 載入) 或應用程式(由AppClassLoader 載入)的一部分)的函式庫,都會遇到此問題,比方說JDBC 或JNDI 就是最好的例子。解決這個問題的方法是透過Context Class Loader,书中未涉及 第3,4章暂时放弃 CH_03.Java与MS Office CH_04.用Visual Studio.net来操控Java虚拟机 本章有问题请教 就是。class文件的加载顺序应该从bootstrap Loader-->extClassLoader-->AppClassLoader,现在我把要执行.class类放在jre目录(c盘)下的classes目录,本应该由bootstrap Loader找到并加载,但现在我的是依然加载d盘的.class文件,有可能的原因是什么? 本人描述的可能不是一般的混乱,各位担待 |
|
返回顶楼 | |
发表时间:2006-12-06
照抄的东西还是放在自己的博客上吧,小心给隐藏了。
|
|
返回顶楼 | |