---------------------- <a >asp.net+Unity開發</a>、<a >.Net培訓</a>、期待與您交流! ----------------------public class Example implements IExample { PRivate int counter; public String message() { return "Version 1"; } public int plusPlus() { return counter++; } public int counter() { return counter; }}我們使用無限循環并打印出Example類信息的的main()方法。我們同樣需要Example類的兩個實例:example1在開始的時候創建一次,example2在每一次循環都重新創建:public class Main { private static IExample example1; private static IExample example2; public static void main(String[] args) { example1 = ExampleFactory.newInstance(); while (true) { example2 = ExampleFactory.newInstance(); System.out.println("1) " + example1.message() + " = " + example1.plusPlus()); System.out.println("2) " + example2.message() + " = " + example2.plusPlus()); System.out.println(); Thread.currentThread().sleep(3000); } }}IExample是一個擁有Example所有方法的接口。這是必須的,因為我們通過另外一個隔離的類加載器加載Example,所以Main不能直接使用它(否則會有ClassCastException)。public interface IExample { String message(); int plusPlus();} 如果去掉異常處理代碼,精簡后的代碼如下:public class ExampleFactory { public static IExample newInstance() { URLClassLoader tmp = new URLClassLoader(new URL[] {getClassPath()}) { public Class loadClass(String name) { if ("example.Example".equals(name)) return findClass(name); return super.loadClass(name); } }; return (IExample) tmp.loadClass("example.Example").newInstance(); }}由于例子需要,方法getClassPath()可以返回一個固定的類路徑(hardcoded classpath)。然而,在完整的代碼中(參見后面的資源章節),你可以看到我們怎么使用ClassLoader.getResource()來做到自動適配的。現在讓我們來執行Main.main,在幾個循環后,我們可以看到輸出:121) Version 1 = 32) Version 1 = 0如我們所期望的,雖然第一個實例的counter被更新了,但第二個還是維持為”0″。如果我們修改Exampler.message()方法,使它返回”Version 2″。輸出如下:121) Version 1 = 42) Version 2 = 0 我們看到,第一個實例繼續增加counter,但使用舊版本的類來輸出版本信息。而第二個實例已經被更新,但所有的狀態都已經丟失了。為了改進這個,我們嘗試為第二個實例重新構造狀態。我們只需從前一個迭代中復制它即可。首先我們為Example類添加一個新的copy方法(和對象的接口方法):public IExample copy(IExample example) { if (example != null) counter = example.counter(); return this;}接著我們更新Main.main()方法中創建第二個對象的那行代碼:1example2 = ExampleFactory.newInstance().copy(example2);等幾個迭代后可以看到:121) Version 1 = 32) Version 1 = 3修改Example.message()方法使它返回”Version 2″輸出:121) Version 1 = 42) Version 2 = 4---------------------- <a >ASP.Net+Unity開發</a>、<a >.Net培訓</a>、期待與您交流! ----------------------
新聞熱點
疑難解答