dalvik.system.PathClassLoader无法转换为java.net.URLClassLoader

3

Android - 动态将jar文件添加到类加载器中,例如:

String strJarfile = "/data/data/com.example.classloader/files/apps/Calc/SumAndSub.jar";    
URLClassLoader sysloader = (URLClassLoader) ClassLoader
                .getSystemClassLoader();
        try
        {
            File f = new File(strJarfile);
            URL u = f.toURI().toURL();

            Class[] parameters = new Class[] { URL.class };
            Method method = URLClassLoader.class.getDeclaredMethod("addURL",
                    parameters);
            method.setAccessible(true);
            method.invoke(sysloader, new Object[] { u });
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }

并且,错误:
Caused by: java.lang.ClassCastException: dalvik.system.PathClassLoader cannot be cast to java.net.URLClassLoader

这段代码在Java Core中可以正常工作,但在Android中却不行。有什么解决方案吗?谢谢。

3个回答

1
URLClassLoader sysloader = (URLClassLoader) ClassLoader.getSystemClassLoader();

ClassLoader.getSystemClassLoader()

将返回PathClassLoader作为ClassLoader,因此(URLClassLoader)会导致异常。


0

嘿,这有点晚了,但我遇到了一些问题,通过创建自己的DexClassLoader解决了它。这是一个现在对我有效的示例函数:

private SomeClass loadSomeClassInJarFile(String pathToJar, String mainClassName, String codeCacheDir) {
    SomeClass instanceOfSomeClass = null;
    try {
        DexClassLoader classLoader = new DexClassLoader(
                                            pathToJar, 
                                            codeCacheDir, 
                                            null, 
                                            mClassLoader);

        Class<?> cls = classLoader.loadClass(mainClassName);
        Constructor<?> cs = cls.getConstructor();
        instanceOfSomeClass = (SomeClass) cs.newInstance();
    } catch (Exception ex) {
        // This isn't the right class
        Log.w(Tag, "Class " + mainClassName + " could not load because " + ex.getMessage());
    }

    return instanceOfSomeClass;
}

关于上述内容的一些说明:
  • mClassLoader 需要是你的 Android 应用程序的类加载器,而不是默认的类加载器。你可以从你的 Application 类中获取它(.getClassLoader())。

  • codeCacheDir 我从我的 ApplicationContext 中获取(.getCodeCacheDir().getPath()),尽管在更近期的 Android 版本中它可能为空。


-2

解决方案不是假设系统类加载器是URLClassLoader。没有任何地方说它是。如果你的代码曾经工作过,那只是运气好而已。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接