论坛首页 入门技术论坛

<<Java深度历险>>学习

浏览 3742 次
该帖已经被评为新手帖
作者 正文
   发表时间:2006-12-06  
OO
小弟菜鸟,欢迎鄙视,我要努力学习,找工作。。
以下说不上学习笔记,基本上照抄

第一章
深入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就可以编译+执行了
不知道这里理解对么?
   发表时间: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文件,有可能的原因是什么?


本人描述的可能不是一般的混乱,各位担待
0 请登录后投票
   发表时间:2006-12-06  
照抄的东西还是放在自己的博客上吧,小心给隐藏了。
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics