您好,登錄后才能下訂單哦!
本篇內容介紹了“Java使用Class.forName加載外部Jar類文件的問題怎么解決”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
在一個框架叫 magic-api 里,可以低代碼的方式寫代碼,動態編譯執行,但是要想加載一些 import 類進來,需要前提在項目里加載 jar 完成后才可以 import,那么這樣每來一個新的 class,就都需要重新加載 class 到項目,然后打包項目,再 import……非常繁瑣!!!
當然這邊還要提到 magic 的一個大概執行過程,拿到一份源碼時,頭文件上的 import 會經過源碼里 Class.forName 進行加載到內存,有人會說,那直接用 URLClassLoader 不就行了,的確可以,但是這樣需要改源碼了,也比較繁瑣,所以為了不該源碼,怎么去兼容又方便的解決這個問題呢?
那么就產生了一個問題,是否有一種辦法可以直接通過外部 jar 直接加載 class 到 JVM 內存呢?
這里大概思路是用 URLClassLoader 來接收文件,然后 Class.forName 就能在項目范圍內拿到該類去加載到內存,就是這樣。
順便提一句:那 magic-api 框架如何兼容這個問題呢,因為需要用到 URLClassLoader,其實在 magic-api 執行拿到的源碼前,提供了一個攔截器,我們可以把 URLClassLoader 放到那邊去做即可!
public class ClassLoadTest { public void test() { // 外部 jar 所在位置 String path = "file:C:\\Users\\Boomni_Sun\\Desktop\\chinadaas-magic-api-0.3.1-SNAPSHOT.jar"; URLClassLoader urlClassLoader = null; try { // 通過URLClassLoader加載外部jar urlClassLoader = new URLClassLoader(new URL[]{new URL(path)}); Class<?> cls = Class.forName("com.chinadaas.magic.api.utils.MyTest", false, urlClassLoader); Object instance = cls.newInstance(); } catch (Exception e) { e.printStackTrace(); } finally { // 卸載關閉外部jar try { urlClassLoader.close(); } catch (IOException e) { System.out.println("關閉外部jar失敗:" + e.getMessage()); } } } }
“Java使用Class.forName加載外部Jar類文件的問題怎么解決”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。