載入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...