看有没有帮助
http://developer.java.sun.com/developer/TechTips/2000/tt1027.html#tip3

解决方案 »

  1.   

    我只知道可以自己編寫有關從classpath 裝入的類的代碼!
    一般java加密解密方面多用到!你查查這方面的書吧!
      

  2.   

    JVM会在第一次使用到这个类的时候加载进入内存,
    在这一步以后,你即使用新的类覆盖了原有的。但是在这次JVM运行中是不会有所改变的这个设置应该是不能够更改的。
      

  3.   

    爪哇教室>不停止程式的狀況下,動態更換元件 我還記得以前在通訊業的時候,客戶們常常要求要能夠提供 7x24x365 
    的服務,試想,如果我們的系統大到不能停機,譬如銀行的交易系統, 
    或是電話系統,只要我們停個幾分鐘,客服部門的電話就會響個不停( 
    當然,偶爾我也會在半夜更換程式),因此當我們程式做修正的時候, 
    我們常常會選一個時間點來更換程式,不過這畢竟不是最後的解決方法 
    。 
    在 Java 方面,如果我們用 Java 寫一個 Server ,這一個 Server 很 
    可能是 TCP/IP Server ,或是其它的提供服務的 Server ,我們有沒 
    有辦法解決這樣的問題?當然有,底下這個 Pattern ,我叫他 UPS ( 
    不斷電系統,可不是快遞),如果你有更好的名字,讓我知道。 UPS 的 
    目的在於讓你的程式不中斷,同時又可以動態去更換某些元件。 首先,我們從一個版本的觀念來看整個程式設計,在開發程式的時候, 
    我們做 OO 分析,分析完,理論上我們會有一些介面(Interface)產 
    生,我們也知道只要我們維持這個介面不變,那麼我可以依照這個介面 
    實做不同的 Driver 或是 Factory ,這些 Driver 或是 Factory 才是 
    真正的程式碼所在,因此,在必要的時候,我可以不更動程式碼,而更 
    換這些 Driver 或是 Factory ,程式將會更有效率,也就是說今天假 
    設 engineer A 遵循這個 Interface 寫了某個 Driver ,但是效率可 
    能比較差,因此我將這個 Interface 拿給 Engineer B 來寫,這時候 
    我的主程式應該不用修改,而可以直接使用 B 所寫出來的 Driver / 
    Factory ,如果我們能夠做到這樣,那麼整個系統才是真的叫做 Software 
    IC (就像是如果我們的主機板選的好的話,我們可以再不更換其他硬體 
    的狀況下,直接把 CPU 換成更快的 CPU 來增加電腦的效能)。因此, 
    在這一個主題中,我希望能夠更進一步的做到動態的更換程式內所使用 
    到的元件,但是我卻不希望我的程式會被中斷。 在我這個範例中,我將我會使用到的 Business Method 抽離出來,讓 
    他成為一個 interface ,如下: ============== Start imain.java ==================== 
    public interface imain 

    public String getName(); 

    ============== End imain.java ==================== 接著我需要依照這一個 imain.java 實做第一個版本的元件, v1.java 
    內容如下: ============== Start v1.java ======================= 
    public class v1 implements imain 

    private int i = 0; 
    public String getName() 

    i++; 
    return "version 1: "+i; 


    ============== End v1.java ======================= 再來,我會做一個版本控制的元件,這一個元件可以是依照您的喜好決 
    定他是否存在,但是我將他抽離出來,這樣您會比較清楚整個程式的運 
    昨模式,這個版本控制的元件叫做 control.java 如下: ============== Start control.java ================== 
    import java.util.*; 
    import java.io.*; public class control 

    String version = "0"; 
    String classname =""; 
    public Object checkVersion() 

    Properties p = new Properties(); 
    Object o = null; 
    try 

    p.load(new FileInputStream("version.txt")); 
    if(version.equals(p.getProperty("version"))) 

    return null; 

    else 

    version = p.getProperty("version"); 
    classname = p.getProperty("classfile"); 
    o = Class.forName(classname).newInstance(); 


    catch(Exception e) 

    System.out.println("==================="); 
    System.out.println(e.toString()); 

    return o; 


    ============== End control.java ================== 這一個 control 主要的一個 method 是會讀入一個 version.txt 檔案 
    ,這一個 version.txt 檔案裡面有兩個參數,一個叫做 version ,另 
    外一個叫做 classfile , version 紀錄著實做 imain.java 的 Factory 
    的版本編號,而 classfile 則紀錄著這一個版本的 class 檔案,也就 
    是當我們的程式呼叫 checkVersion 的時候,他會去檢查這個版本控制 
    檔案,如果與目前的版本不吻合,則依照檔名載入相關的版本的元件, 
    同時將產生的物件 (Object) 回傳給使用者。如果版本相同,則不做任 
    何的動作,而回傳給使用者 null 。 
    control.java 裡面的一個特色是使用 "Object" 來當作傳遞的物件, 
    另外,裡面也不是直接使用 new 的方式來產生物件,而是透過 
    Class.forName(String classfile).newInstance() 的方式來產生新的 
    物件,這種方式的優點是我們不需要將程式碼寫死,我的 classfile 
    可以是字串,這個字串可以由參數傳入,或是像我們的範例中,由檔案 
    讀入。這種模式你一定覺得很眼熟,因為 JDBC 正是利用這種方式來產 
    生他們的 Driver 的。 而我們的 version.txt 範例如下: ============== Start version.txt ================== 
    classfile=v1 
    version=1 
    ============== End version.txt ================== 到這裡,讀者門應該很清楚的知道我的用意了,不過我們還是先來看看 
    我們的主程式,我們的主程式如下: ============== Start changeit.java ================== 
    public class changeit 

    public static void main(String argv[]) 

    control c = new control(); 
    imain im = (imain)c.checkVersion(); 
    int i = 0; 
    while(true) 

    i++; 
    if(i % 100000 == 0) 

    System.out.println(im.getName()); 
    Object o = c.checkVersion(); 
    if(o != null) 

    im = null; 
    im = (imain)o; 

    try { Thread.sleep(500); } 
    catch(Exception e) {;} 




    ============== End changeit.java ================== changeit.java 主要的動作是會使用 imain 這個 interface ,來將 
    control.java 所回傳的 object 轉型,同時我們就可以透過 imain 
    來執行我們所想要使用的 method ,來達成一些目的。但是 changeit 
    中有一個很重要的步驟是他會透過 control 來檢查目前是否要更換元 
    件,如果要更換,則依然透過 control 來更換,因此在程式中,我們 
    只看到我們只用了一次 new ,用來產生 control ,imain 所使用的 
    object 則不是透過 new 來產生。 我們現在先來執行 changeit ,結果如下: ============== Start java changeit ================== 
    C:\temp\java\tmp\chclass>java changeit 
    version 1: 1 
    version 1: 2 
    version 1: 3 
    version 1: 4 
    version 1: 5 
    ... 
    不要中斷他... 
    ============== End java changeit ================== 當程式一開始執行,我們就不要中斷他,讓他繼續一直執行下去。 
    這時候,我打算更換這一個元件,因此我在同一個目錄下,又實做了 
    imain.java 而產生一個 v2.java ,這一個 v2.java 會回傳 
    version 2: ... ============== Start v2.java ======================= 
    public class v2 implements imain 

    private int i = 0; 
    public String getName() 

    i++; 
    return "Nicholas's new Component v2: "+i; 


    ============== End v2.java ======================= 寫好之後記得將他 compile 好,同時我們修改 version.txt 將 
    classfile修改為 v2 ,而將版本編號從 1 變成 2 ,我們如果回到 
    control.java 這個程式,我們會知道,一但他判斷出版本編號更動後 
    ,他才會真的進行更換元件的動作,否則他只是簡單的回傳 null 。 
    因此我們的 version.txt 被我修改後如下: ============== Start version.txt ================== 
    classfile=v2 
    version=2 
    ============== End version.txt ================== 當我們修改好之後,一存檔,再切回原來執行 java changeit 的視窗 
    ,你會看到下面的狀況: ============== Continue java changeit ================== 
    以上省略 
    ... 
    version 1: 499 
    version 1: 500 
    version 1: 501 
    Nicholas's new Component v2: 1 
    Nicholas's new Component v2: 2 
    Nicholas's new Component v2: 3 
    Nicholas's new Component v2: 4 
    ... 
    以下省略 
    ============== End java changeit ================== 系統的輸出由 version 1 變成 Nicholas's New Component 了。沒錯, 
    現在整個系統是以 v2.java 這個元件在運作了,但是很重要的一個過程 
    是我們自始至終,並沒有將 java changeit 這個執行程序停止。 我想,到這裡,你應該已經知道如何將這個機制或是設計理念運用到您 
    的系統當中, control.java 配合 version.txt 只是一個讓您很容易瞭 
    解這個機制的運作方式的一個範例,在實做上,您可能是透過一個輸入 
    ,或是另外一種管理機制來管理你的元件,甚至我說,你可以同時控制 
    好幾個元件的版本,而不只一個,只要你稍微修改一下,就可以達到這 
    個目的。 再回頭看看這整個過程,你會發現,如果我們的程式或是計畫,在開始 
    之前,做好 OO 的設計,接著將介面給定義出來,之後只要實做這些介 
    面,我們做出許多意想不到的功能,而對整個系統來說,也會有很大的 
    幫助,也就是說除了介面之外,我們可以將邏輯抽離開來成為元件,這 
    些就不在這裡細談了。 測試環境: 
    UltraSparc 5 / Solaris 7 / JDK 1.3.0 
    Pentium III / Windows 2000 / JDK 1.3.1 
    Nicholas Hsiao ([email protected]
      

  4.   

    一般来说是用到的时候才调入,如:public class Ctest{
    public static void main(String[] args){
    m15(0);
    } public static void m15(int i){
            if(i==1){
    c15 xxx=new c15();
        }
    }
    }
    class c15{}你编译完后,在执行时,即使把c15.class删掉,也可以正常执行Ctest