java程式中動態載入jar包並執行

2021-07-15 06:28:29 字數 1996 閱讀 8806

載入jar包的類urlclassloader中使用的方法為addurl,但是這個方法是protected型別

分別用了兩種方法

一、參考 

反射到這個類

method add = urlclassloader.class.getdeclaredmethod("addurl", new class );  

add.setaccessible(true);

然後再執行add載入jar包,之後再次反射獲取需要執行的類

urlclassloader classloader = (urlclassloader)classloader.getsystemclassloader();  

url url = new file(jarpath).touri().tourl();

add.invoke(classloader, new object );

class<?> clazz = class.forname(classname);

method method = clazz.getdeclaredmethod("***x");

method.invoke(clazz.newinstance());

最開始使用的是下面的方法,感覺簡單,但是由於沒設定parentclassloader,導致出現各種bug,最後雖然調通了,但是依然選擇了上面的方法(不確定是否還有其他問題) 二、

參考的文章中先建立個子類,這樣可以執行addurl這個方法了

static class myclassloader extends urlclassloader 

public myclassloader(url urls, classloader parent)

public void addjar(url url)

}

載入jar,並執行

url urls = new url {};

myclassloader classloader = new myclassloader(urls,classloader.getsystemclassloader())

try catch (exception e)

另、如果是本地jar的話,這樣就ok了,在hdfs上的話,會有點問題,url不支援hdfs協議

url.seturlstreamhandle***ctory(new fsurlstreamhandle***ctory());

這樣就支援hdfs協議了,path就可以轉url了,當然,得載入下hdfs相關配置檔案,獲取filesystem例項

path path = fs.getfilestatus(new path(jarpath)).getpath();

url url = path.touri().tourl();

classloader.addjar(url);

只執行普通jar的話,在hdfs上是可以的

但是如果載入的是mapreduce程式的jar包,只能是本地路徑,不能使用hdfs路徑,在setjarbyclass方法中,是需要尋找到jar包絕對路徑的

使用一段時間後發現,程序是不停的,需要載入的jar包是可能需要修改的,所以導致多次載入不同版本的jar包之後,程式會有bug,讀不到最新的jar包,不太可能更新jar包就重啟下程式

於是,又研究了下classloarder,在當前執行緒載入jar包比較保險,執行緒結束會釋放掉,保證每次載入都是最新的,而且也不佔記憶體

(urlclassloader)classloader.getsystemclassloader();
改為當前執行緒類載入器

(urlclassloader)thread.currentthread().getcontextclassloader();

動態載入jar包中的類(方式一)

嘛,直接上 這個類載入器的作用是,如果載入的類字首為 com.squareup.okhttp,那麼就重專案的根目錄的doc jar 下的okhttp 1.2.1.jar和okhttp protocols 1.2.1.jar中去載入。注意jar包是乙個歸檔檔案,裡面的例項名稱是這樣的 所以類名clas...

android動態載入jar

jar的載入 jar放在assert中 dexclassloader dexclassloader null classloader localclassloader this.getclassloader try catch ioexception e fileoutputstream out n...

Java在jar包中載入so包dll包dylib等

使用ide為idea,lib libxyz.so位於resource下,通過動態設定jar路徑,然後載入。system.loadlibrary xyz 如果直接啟動idea系統正常載入。但將項打包為jar,啟動jar包執行確出現找不到jar載入異常,產生unsatisfied linked erro...