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

本文详细解析了在Android环境中使用自定义SDK时遇到的动态加载Jar包问题,特别是Class加载器引发的空指针异常。通过分析,发现UrlClassLoader在Android环境下存在局限性,并给出了解决方案,建议使用DexClassLoader替代。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

环境

  • 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.youkuaiyun.com/pengjianbosoft/article/details/6905771
    在这里插入图片描述

解决

使用DexClassLoader替换UrlClassLoader

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值