2 回答

TA貢獻(xiàn)1865條經(jīng)驗(yàn) 獲得超7個(gè)贊
我認(rèn)為您正在嘗試做的是違反直覺(jué)且容易出錯(cuò)的。
您不必使用這種方法。相反,提取您想要在庫(kù)中共享的 API 并在雙方共享:提供者和客戶端。
此外,您的示例存在缺陷,因?yàn)槟褂昧薝RLClassLoader依賴于父類加載器的構(gòu)造函數(shù):
URLClassLoader urlClassLoader = new URLClassLoader(
new URL[]{new URL("file:\\path\\to\\testlib.jar")});
正如文檔所述:
使用默認(rèn)委托父類加載器為指定的 URL 構(gòu)造一個(gè)新的 URLClassLoader。在父類加載器中首次搜索后,將按照為類和資源指定的順序搜索 URL。
所以這意味著:
Class<AbstractClass> MyClass = (Class<AbstractClass>)urlClassLoader.loadClass("com.test.MyClass");
您加載在當(dāng)前類路徑中定義的類,而不是在 JAR 中。
所以這個(gè)賦值只能在AbstractClass聲明的類型也指當(dāng)前類路徑中的哪個(gè)類型時(shí)起作用,而不是在 JAR 中:
AbstractClass myObject = c.newInstance();
不要使用默認(rèn)的父類加載器,你可能會(huì)看到拋出 java.lang.ClassCastException:
URLClassLoader urlClassLoader = new URLClassLoader(
new URL[]{new URL("file:\\path\\to\\testlib.jar")}, null);

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超5個(gè)贊
剛剛使用在 Android 7.1.1 上測(cè)試了這種方法DexClassLoader
并且它有效,但是在 Android 4.2.2 上測(cè)試時(shí)失敗了。
添加回答
舉報(bào)