2 回答
TA贡献1865条经验 获得超7个赞
我认为您正在尝试做的是违反直觉且容易出错的。
您不必使用这种方法。相反,提取您想要在库中共享的 API 并在双方共享:提供者和客户端。
此外,您的示例存在缺陷,因为您使用了URLClassLoader依赖于父类加载器的构造函数:
URLClassLoader urlClassLoader = new URLClassLoader(
new URL[]{new URL("file:\\path\\to\\testlib.jar")});
正如文档所述:
使用默认委托父类加载器为指定的 URL 构造一个新的 URLClassLoader。在父类加载器中首次搜索后,将按照为类和资源指定的顺序搜索 URL。
所以这意味着:
Class<AbstractClass> MyClass = (Class<AbstractClass>)urlClassLoader.loadClass("com.test.MyClass");
您加载在当前类路径中定义的类,而不是在 JAR 中。
所以这个赋值只能在AbstractClass声明的类型也指当前类路径中的哪个类型时起作用,而不是在 JAR 中:
AbstractClass myObject = c.newInstance();
不要使用默认的父类加载器,你可能会看到抛出 java.lang.ClassCastException:
URLClassLoader urlClassLoader = new URLClassLoader(
new URL[]{new URL("file:\\path\\to\\testlib.jar")}, null);
TA贡献1802条经验 获得超5个赞
刚刚使用在 Android 7.1.1 上测试了这种方法DexClassLoader
并且它有效,但是在 Android 4.2.2 上测试时失败了。
添加回答
举报