很多時候 我們寫的Java程序是分模塊的,有很好的擴展機制,即我們可以為我們自己的java類添加插件,來運行將來某天我們可能開發出來的類,以下稱這些類為插件類。
下邊是一種簡單的實現方法:
Class A 作為程序的主入口,其中包含了程序的執行入口(main)函數。然后在main函數中通過外部的配置文件,然后通過外部的配置文件,我們可以獲得插件類的信息(位於哪個jar包,jar包的具體路徑),然后獲得jar包中某一個類的實例,來完成相應的工作。這個jar包很可能是外部的jar包,是我們自己寫好的,那么我們放到哪里,他才能自己找到呢?我嘗試過很多次,除非將其具體目錄,放到class_path中才可以成功執行,否則報的異常只有一個ClassNotFoundException,就是找不到類。不過還有一種方法,就是將該jar包解壓到運行jar包所在的目錄,這樣就可以通過class_path中的.來獲得相應的類了。不過這樣會顯得很不專業,java寫出來的東西都是jar包啊,自己感覺的。放到claspath中,不能每次寫出新的jar包都配置一遍吧!
如此出現了如下的解決辦法:
想了解解決辦法的含義,首先要了解java的類加載機制。眾所周知,程序若想執行,必須加載到內存當中才能成功執行。java程序並不是可執行文件,由許多獨立的類文件來完成。所以java中加載程序是以類為單外來完成的。這也就需要我們來簡單了解一下java的class loader加載機制。
java程序開始執行,遇到的第一個classloader是bootstrap classloader,這個classloader是用c++語言編寫,通過他來完成加載java中的核心類。第二個classloader是extension classloader,加載的是jre/lib目錄中的ext目錄中的jar包。然后第三個是system classloader,也被稱為應用加載器,主要負責完成加載-classpath 或者系統中的全局變量ClassPath中的類。System.out.println(System.getProperty(“java.class.path”));可以獲得classpath的配置,也就是system classloader 加載的類,第四個class loader可能是用戶自定義的加載器,來自定義加載類。通常一個類的加載過程是這樣的通過當前的類加載器的父加載器嘗試查找,如果沒有再找其父加載器嘗試加載,直到最終的bootstrap classloader為止,如果還沒有找到,那么就開始從上往下加載類。這樣做的目的是防止自定義的類來覆蓋系統中的類,如果沒有這種機制很容易出現這種笑話,自己寫了一個String類,然后new string的時候是自己寫的String類,這樣就比較好玩了。
1.自己定義URLClassLoader對象加載外部jar包,針對jar包里面不再出現別的jar包的情況,即只解析.class文件:
以上的這種情況可以在別的project項目里寫test方法,是平時最常用的,如果當.class文件里有依賴別的jar包里的對象的時候,就要把該jar包拷貝到寫此測試方法的project並buildPath,不然的話運行的時候會報找不到Class對象的異常。
2.第二種情況是針對加載jar包里面的jar包的Class對象,還有讀取某一個properties文件的方法。
3.第三種情況是在該項目下獲取某個包的Class對象,當然了,測試方法是在該項目下寫的(這樣classLoader就直接可以知道對象了,不需要再自定義URLClassLoader了,用Thread.currentThread().getContextClassLoader().loadClass(.....)就可以直接獲得Class對象了,回去ClassPath下找,System.out.print(System.getProperty("java.class.path"))就可以找到classPath路徑)。
下面上第二段代碼
好了,大致就是這樣,好好學習,天天向上!哈哈~~
補充:
4.讀取jar包中的entity_pk.properties鍵值對到項目本地entity_pk.properties文件中
5.讀寫db_config.xml文件