亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 了解 java classloader.txt

?? 含有許多JAVA的技巧!
?? TXT
?? 第 1 頁 / 共 2 頁
字號:
了解 JAVA classloader 
(加入日期:2001-9-22 點擊數:1057)
【對此文發表評論】 【編程愛好者論壇】 【保存文章至硬盤】 【打印文章】 
 
什么是 ClassLoader? 


在流行的商業化編程語言中,Java 語言由于在 Java 虛擬機 (JVM) 上運行而顯得與眾不同。這意味著已編譯的程序是一種特殊的、獨立于平臺的格式,并非依賴于它們所運行的機器。在很大程度上,這種格式不同于傳統的可執行程序格式。 

與 C 或 C++ 編寫的程序不同,Java 程序并不是一個可執行文件,而是由許多獨立的類文件組成,每一個文件對應于一個 Java 類。 
此外,這些類文件并非立即全部都裝入內存,而是根據程序需要裝入內存。ClassLoader 是 JVM 中將類裝入內存的那部分。 
而且,Java ClassLoader 就是用 Java 語言編寫的。這意味著創建您自己的 ClassLoader 非常容易,不必了解 JVM 的微小細節。 


為什么編寫 ClassLoader? 


如果 JVM 已經有一個 ClassLoader,那么為什么還要編寫另一個呢?問得好。缺省的 ClassLoader 只知道如何從本地文件系統裝入類文件。不過這只適合于常規情況,即已全部編譯完 Java 程序,并且計算機處于等待狀態。 

但 Java 語言最具新意的事就是 JVM 可以非常容易地從那些非本地硬盤或從網絡上獲取類。例如,瀏覽者可以使用定制的 ClassLoader 從 Web 站點裝入可執行內容。 

有許多其它方式可以獲取類文件。除了簡單地從本地或網絡裝入文件以外,可以使用定制的 ClassLoader 完成以下任務: 
在執行非置信代碼之前,自動驗證數字簽名
使用用戶提供的密碼透明地解密代碼
動態地創建符合用戶特定需要的定制化構建類
任何您認為可以生成 Java 字節碼的內容都可以集成到應用程序中。 



定制 ClassLoader 示例 


如果使用過 JDK 或任何基于 Java 瀏覽器中的 Applet 查看器,那么您差不多肯定使用過定制的 ClassLoader。 

Sun 最初發布 Java 語言時,其中最令人興奮的一件事是觀看這項新技術是如何執行在運行時從遠程的 Web 服務器裝入的代碼。(此外,還有更令人興奮的事 -- Java 技術提供了一種便于編寫代碼的強大語言。)更一些令人激動的是它可以執行從遠程 Web 服務器通過 HTTP 連接發送過來的字節碼。 

此項功能歸功于 Java 語言可以安裝定制 ClassLoader。Applet 查看器包含一個 ClassLoader,它不在本地文件系統中尋找類,而是訪問遠程服務器上的 Web 站點,經過 HTTP 裝入原始的字節碼文件,并把它們轉換成 JVM 內的類。 

瀏覽器和 Applet 查看器中的 ClassLoaders 還可以做其它事情:它們支持安全性以及使不同的 Applet 在不同的頁面上運行而互不干擾。 

Luke Gorrie 編寫的 Echidna 是一個開放源碼包,它可以使您在單個虛擬機上運行多個 Java 應用程序。它使用定制的 ClassLoader,通過向每個應用程序提供該類文件的自身副本,以防止應用程序互相干擾。 


我們的 ClassLoader 示例 


了解了 ClassLoader 如何工作以及如何編寫 ClassLoader 之后,我們將創建稱作 CompilingClassLoader (CCL) 的 Classloader。CCL 為我們編譯 Java 代碼,而無需要我們干涉這個過程。它基本上就類似于直接構建到運行時系統中的 "make" 程序。 
注:進一步了解之前,應注意在 JDK 版本 1.2 中已改進了 ClassLoader 系統的某些方面(即 Java 2 平臺)。本教程是按 JDK 版本 1.0 和 1.1 寫的,但也可以在以后的版本中運行。 

Java 2 中 ClassLoader 的變動描述了 Java 版本 1.2 中的變動,并提供了一些詳細信息,以便修改 ClassLoader 來利用這些變動。 

ClassLoader 的基本目標是對類的請求提供服務。當 JVM 需要使用類時,它根據名稱向 ClassLoader 請求這個類,然后 ClassLoader 試圖返回一個表示這個類的 Class 對象。 通過覆蓋對應于這個過程不同階段的方法,可以創建定制的 ClassLoader。 

在本文的其余部分,您會學習 Java ClassLoader 的關鍵方法。您將了解每一個方法的作用以及它是如何適合裝入類文件這個過程的。您也會知道,創建自己的 ClassLoader 時,需要編寫什么代碼。 

在下文中,您將會利用這些知識來使用我們的 ClassLoader 示例 -- CompilingClassLoader。 


方法 loadClass 

ClassLoader.loadClass() 是 ClassLoader 的入口點。其特征如下: 
Class loadClass( String name, boolean resolve ); 
name 參數指定了 JVM 需要的類的名稱,該名稱以包表示法表示,如 Foo 或 java.lang.Object。 resolve 參數告訴方法是否需要解析類。在準備執行類之前,應考慮類解析。并不總是需要解析。如果 JVM 只需要知道該類是否存在或找出該類的超類,那么就不需要解析。 
在 Java 版本 1.1 和以前的版本中,loadClass 方法是創建定制的 ClassLoader 時唯一需要覆蓋的方法。(Java 2 中 ClassLoader 的變動提供了關于 Java 1.2 中 findClass() 方法的信息。) 


方法 defineClass 


defineClass 方法是 ClassLoader 的主要訣竅。該方法接受由原始字節組成的數組并把它轉換成 Class 對象。原始數組包含如從文件系統或網絡裝入的數據。 

defineClass 管理 JVM 的許多復雜、神秘和倚賴于實現的方面 -- 它把字節碼分析成運行時數據結構、校驗有效性等等。不必擔心,您無需親自編寫它。事實上,即使您想要這么做也不能覆蓋它,因為它已被標記成最終的。 


方法 findSystemClass 


findSystemClass 方法從本地文件系統裝入文件。它在本地文件系統中尋找類文件,如果存在,就使用 defineClass 將原始字節轉換成 Class 對象,以將該文件轉換成類。當運行 Java 應用程序時,這是 JVM 正常裝入類的缺省機制。(Java 2 中 ClassLoader 的變動提供了關于 Java 版本 1.2 這個過程變動的詳細信息。) 

對于定制的 ClassLoader,只有在嘗試其它方法裝入類之后,再使用 findSystemClass。原因很簡單:ClassLoader 是負責執行裝入類的特殊步驟,不是負責所有類。例如,即使 ClassLoader 從遠程的 Web 站點裝入了某些類,仍然需要在本地機器上裝入大量的基本 Java 庫。而這些類不是我們所關心的,所以要 JVM 以缺省方式裝入它們:從本地文件系統。這就是 findSystemClass 的用途。 

其工作流程如下: 
請求定制的 ClassLoader 裝入類。
檢查遠程 Web 站點,查看是否有所需要的類。
如果有,那么好;抓取這個類,完成任務。
如果沒有,假定這個類是在基本 Java 庫中,那么調用 findSystemClass,使它從文件系統裝入該類。


在大多數定制 ClassLoaders 中,首先調用 findSystemClass 以節省在本地就可以裝入的許多 Java 庫類而要在遠程 Web 站點上查找所花的時間。然而,正如,在下一章節所看到的,直到確信能自動編譯我們的應用程序代碼時,才讓 JVM 從本地文件系統裝入類。 


方法 resolveClass 
正如前面所提到的,可以不完全地(不帶解析)裝入類,也可以完全地(帶解析)裝入類。當編寫我們自己的 loadClass 時,可以調用 resolveClass,這取決于 loadClass 的 resolve 參數的值。 


方法 findLoadedClass 
findLoadedClass 充當一個緩存:當請求 loadClass 裝入類時,它調用該方法來查看 ClassLoader 是否已裝入這個類,這樣可以避免重新裝入已存在類所造成的麻煩。應首先調用該方法。 


組裝 
讓我們看一下如何組裝所有方法。 
我們的 loadClass 實現示例執行以下步驟。(這里,我們沒有指定生成類文件是采用了哪種技術 -- 它可以是從 Net 上裝入、或者從歸檔文件中提取、或者實時編譯。無論是哪一種,那是種特殊的神奇方式,使我們獲得了原始類文件字節。) 


CCL 揭密 
我們的 ClassLoader (CCL) 的任務是確保代碼被編譯和更新。 
下面描述了它的工作方式: 
當請求一個類時,先查看它是否在磁盤的當前目錄或相應的子目錄。
如果該類不存在,但源碼中有,那么調用 Java 編譯器來生成類文件。
如果該類已存在,檢查它是否比源碼舊。如果是,調用 Java 編譯器來重新生成類文件。
如果編譯失敗,或者由于其它原因不能從現有的源碼中生成類文件,返回 ClassNotFoundException。
如果仍然沒有該類,也許它在其它庫中,所以調用 findSystemClass 來尋找該類。
如果還是沒有,則返回 ClassNotFoundException。
否則,返回該類。
調用 findLoadedClass 來查看是否存在已裝入的類。
如果沒有,那么采用那種特殊的神奇方式來獲取原始字節。
如果已有原始字節,調用 defineClass 將它們轉換成 Class 對象。
如果沒有原始字節,然后調用 findSystemClass 查看是否從本地文件系統獲取類。
如果 resolve 參數是 true,那么調用 resolveClass 解析 Class 對象。
如果還沒有類,返回 ClassNotFoundException。
否則,將類返回給調用程序。


Java 編譯的工作方式 
在深入討論之前,應該先退一步,討論 Java 編譯。通常,Java 編譯器不只是編譯您要求它編譯的類。它還會編譯其它類,如果這些類是您要求編譯的類所需要的類。 
CCL 逐個編譯應用程序中的需要編譯的每一個類。但一般來說,在編譯器編譯完第一個類后,CCL 會查找所有需要編譯的類,然后編譯它。為什么?Java 編譯器類似于我們正在使用的規則:如果類不存在,或者與它的源碼相比,它比較舊,那么它需要編譯。其實,Java 編譯器在 CCL 之前的一個步驟,它會做大部分的工作。 

當 CCL 編譯它們時,會報告它正在編譯哪個應用程序上的類。在大多數的情況下,CCL 會在程序中的主類上調用編譯器,它會做完所有要做的 -- 編譯器的單一調用已足夠了。 

然而,有一種情形,在第一步時不會編譯某些類。如果使用 Class.forName 方法,通過名稱來裝入類,Java 編譯器會不知道這個類時所需要的。在這種情況下,您會看到 CCL 再次運行 Java 編譯器來編譯這個類。在源代碼中演示了這個過程。 


使用 CompilationClassLoader 
要使用 CCL,必須以特殊方式調用程序。不能直接運行該程序,如: % java Foo arg1 arg2 
應以下列方式運行它: 
% java CCLRun Foo arg1 arg2 


CCLRun 是一個特殊的存根程序,它創建 CompilingClassLoader 并用它來裝入程序的主類,以確保通過 CompilingClassLoader 來裝入整個程序。CCLRun 使用 Java Reflection API 來調用特定類的主方法并把參數傳遞給它。有關詳細信息,請參閱源代碼。 


運行示例 
源碼包括了一組小類,它們演示了工作方式。主程序是 Foo 類,它創建類 Bar 的實例。類 Bar 創建另一個類 Baz 的實例,它在 baz 包內,這是為了展示 CCL 是如何處理子包里的代碼。Bar 也是通過名稱裝入的,其名稱為 Boo,這用來展示它也能與 CCL 工作。 

每個類都聲明已被裝入并運行。現在用源代碼來試一下。編譯 CCLRun 和 CompilingClassLoader。確保不要編譯其它類(Foo、Bar、Baz 和 Boo),否則將不會使用 CCL,因為這些類已經編譯過了。 

% java CCLRun Foo arg1 arg2
CCL: Compiling Foo.java...
foo! arg1 arg2
bar! arg1 arg2
baz! arg1 arg2
CCL: Compiling Boo.java...
Boo!


請注意,首先調用編譯器,Foo.java 管理 Bar 和 baz.Baz。直到 Bar 通過名稱來裝入 Boo 時,被調用它,這時 CCL 會再次調用編譯器來編譯它。 
CompilingClassLoader.java 


以下是 CompilingClassLoader.java 的源代碼 

// $Id$
import java.io.*;
/*
A CompilingClassLoader compiles your Java source on-the-fly.  It checks
for nonexistent .class files, or .class files that are older than their
corresponding source code.
*/
public class CompilingClassLoader extends ClassLoader
{
  // Given a filename, read the entirety of that file from disk
  // and return it as a byte array.
  private byte[] getBytes( String filename ) throws IOException {
    // Find out the length of the file
    File file = new File( filename );
    long len = file.length();
    // Create an array that's just the right size for the file's
    // contents
    byte raw[] = new byte[(int)len];
    // Open the file
    FileInputStream fin = new FileInputStream( file );
    // Read all of it into the array; if we don't get all,
    // then it's an error.
    int r = fin.read( raw );
    if (r != len)
      throw new IOException( "Can't read all, "+r+" != "+len );
    // Don't forget to close the file!

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人综合婷婷国产精品久久蜜臀| 一区二区三区高清| 国产美女精品在线| 国产午夜精品一区二区| 成人免费av在线| 综合激情成人伊人| 欧洲视频一区二区| 日本午夜精品视频在线观看| 欧美成人女星排行榜| 国产精品一区二区在线观看网站| 久久综合丝袜日本网| 99久久99久久精品国产片果冻| 亚洲色大成网站www久久九九| 色婷婷久久综合| 日本va欧美va瓶| 久久久久久免费网| 91丨porny丨国产| 午夜精品久久久久久久蜜桃app| 欧美理论在线播放| 国产精品一区在线观看乱码| 亚洲精品视频免费看| 欧美一区二区不卡视频| 国产黑丝在线一区二区三区| 亚洲欧美成aⅴ人在线观看| 欧美日韩www| 大陆成人av片| 日韩国产在线观看一区| 久久久久久影视| 欧美色图激情小说| 狠狠色狠狠色综合日日91app| 国产精品久久久久久久岛一牛影视 | 久久亚区不卡日本| 色诱视频网站一区| 九一久久久久久| 亚洲免费在线电影| 精品电影一区二区三区| 日本韩国一区二区| 国产精品综合视频| 丝袜美腿成人在线| 国产精品美女久久福利网站| 日韩精品一区二区三区三区免费| 91在线视频播放地址| 久久精品国产精品亚洲精品| 亚洲欧美日本在线| 久久久精品蜜桃| 91精品国产欧美日韩| 色8久久人人97超碰香蕉987| 国产精品综合网| 麻豆精品精品国产自在97香蕉| 亚洲乱码精品一二三四区日韩在线| 日韩精品一区国产麻豆| 欧美性高清videossexo| 成人a级免费电影| 久久精品国产99| 日本va欧美va瓶| 性欧美大战久久久久久久久| 国产精品传媒在线| 国产亚洲va综合人人澡精品| 日韩欧美精品在线视频| 欧美高清激情brazzers| 色综合久久综合网97色综合| 成人一区在线观看| 国产黄人亚洲片| 国产麻豆午夜三级精品| 麻豆精品久久精品色综合| 日本不卡免费在线视频| 日韩成人一级大片| 视频一区二区欧美| 午夜精品在线看| 日韩国产欧美一区二区三区| 肉丝袜脚交视频一区二区| 日日摸夜夜添夜夜添精品视频| 亚洲午夜私人影院| 亚洲国产乱码最新视频| 亚洲综合久久av| 亚洲一区二区三区影院| 亚洲国产日韩av| 天堂精品中文字幕在线| 三级影片在线观看欧美日韩一区二区 | 高清国产一区二区三区| 国产福利91精品一区二区三区| 国产精品亚洲а∨天堂免在线| 狠狠狠色丁香婷婷综合激情| 国产一区二区三区免费观看| 国产真实乱子伦精品视频| 国产精品99久久久久久似苏梦涵| 黄色日韩三级电影| av中文字幕在线不卡| 日本韩国欧美三级| 欧美日韩亚洲不卡| 日韩久久精品一区| 国产日韩欧美在线一区| 国产精品女主播在线观看| 一区二区三区日韩欧美精品| 亚洲成人在线观看视频| 蜜芽一区二区三区| 国产乱子轮精品视频| www.色精品| 欧美日韩三级一区| 日韩女优av电影在线观看| 久久精品夜色噜噜亚洲a∨| 亚洲国产精品二十页| 一区二区三区精品视频在线| 日韩精品一级中文字幕精品视频免费观看| 日韩福利视频网| 成人国产精品视频| 欧美日韩激情在线| 久久婷婷色综合| 一区二区三区高清不卡| 紧缚奴在线一区二区三区| 成人v精品蜜桃久久一区| 欧美日韩一区国产| 久久久精品免费网站| 亚洲午夜久久久久久久久久久| 另类的小说在线视频另类成人小视频在线| 国产精品66部| 欧美日韩午夜影院| 中文字幕不卡的av| 午夜精品福利一区二区三区蜜桃| 国内成人精品2018免费看| 91蜜桃免费观看视频| 精品免费一区二区三区| 亚洲免费av高清| 国模冰冰炮一区二区| 欧美中文字幕久久| 国产午夜精品理论片a级大结局| 一区二区三区中文在线观看| 国产呦精品一区二区三区网站| 91福利资源站| 国产精品丝袜91| 捆绑调教一区二区三区| 91久久精品国产91性色tv| 国产午夜亚洲精品午夜鲁丝片| 亚洲宅男天堂在线观看无病毒| 国产精品一二三| 日韩久久久精品| 日韩中文字幕不卡| 91福利资源站| 国产精品久久久久aaaa樱花| 国产美女主播视频一区| 91精品国产一区二区| 一区二区三区四区激情| aa级大片欧美| 国产精品久线在线观看| 国产精品69毛片高清亚洲| 日韩欧美电影在线| 日韩精品福利网| 欧美日韩综合不卡| 艳妇臀荡乳欲伦亚洲一区| 成人免费电影视频| 国产三级精品视频| 国产一级精品在线| 久久久无码精品亚洲日韩按摩| 看电视剧不卡顿的网站| 欧美一区二区播放| 免费成人在线观看| 日韩欧美在线影院| 蜜臀av一区二区在线观看| 欧美高清视频一二三区| 亚洲福利一二三区| 欧美日韩国产中文| 亚洲高清在线精品| 欧美日韩国产乱码电影| 亚洲一二三四久久| 在线观看国产日韩| 亚洲国产日韩在线一区模特| 欧美色涩在线第一页| 午夜电影一区二区| 欧美日高清视频| 日韩激情中文字幕| 精品国产不卡一区二区三区| 国产精一区二区三区| 国产婷婷一区二区| 成人看片黄a免费看在线| 国产精品短视频| 在线精品视频一区二区三四| 亚洲自拍另类综合| 91精品国产综合久久蜜臀| 久久精品国产第一区二区三区| 亚洲精品在线观| 成人福利视频在线看| 一区二区三区资源| 欧美日韩国产高清一区| 日韩av中文字幕一区二区三区| 精品久久久久久久久久久久久久久久久 | www国产精品av| 国产一区二区三区av电影| 亚洲国产精品99久久久久久久久 | 亚洲欧美日韩系列| 在线观看日韩一区| 日本欧美一区二区| 久久久久国产精品麻豆ai换脸| 成人免费视频app| 亚洲18女电影在线观看| 日韩片之四级片| 99久久国产免费看| 秋霞电影一区二区| 国产精品大尺度| 欧美一二三四区在线| 成人性生交大片免费看中文|