环境
- 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