android 动态加载(反射)jar包,loadClass报错Caused by: java.lang.NullPointerException

环境

  • Android 个人编写的SDK

问题

                ClassLoader TvUrlClassLoader = new URLClassLoader(new URL[]{TvPluginUrl});
                if(TvUrlClassLoader == null){
                    Log.e("appscan", "create classloader failed");
                    continue;
                }
                /** 4.反射调用插件的功能接口*/
                String TvClassName = "com.appscan.pluginframe." + Tvkey + "Impl";
                Log.i("appscan", "准备加载类: " + TvClassName);
                Class<?> TvClazz = TvUrlClassLoader.loadClass(TvClassName);

思路

1.定位出错点

报错信息,主要是下面这一行报错提示出,上面代码中Class<?> TvClazz = TvUrlClassLoader.loadClass(TvClassName);引起的空指针异常

     Caused by: java.lang.NullPointerException
	................
        at com.appscan.PluginManager.execAllPlugin(PluginManager.java:96)

出错点

  • TvUrlClassLoader
  • .loadClass(TvClassName)

2.分析出错原因

  • TvUrlClassLoader
    试错:经过动态跟踪,TvUrlClassLoader这个类加载器不是空的,所以排除
  • .loadClass(TvClassName)
    如果TvClassName不存在或者错误,会跑出NotFound异常,而非空指针异常,排除

3.扩展分析范围,继续定位出错点

跳出当前语句,向外层扩展,包含这个语句的代码功能是反射调用、动态加载jar包

  • 代码参考的是Java插件化开发(动态加载jar包),而实现的环境是Android

4.继续分析出错原因

  • Java插件化开发(动态加载jar包)
    出错的代码是根据Java插件化开发代码来写的,而android平台上的动态加载jar包是通过DexClassloader类执行的
    参考:https://blog.csdn.net/pengjianbosoft/article/details/6905771
    在这里插入图片描述

解决

使用DexClassLoader替换UrlClassLoader

发布了118 篇原创文章 · 获赞 14 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/github_38641765/article/details/99643398