难倒高手的JVM URLClassLoader类加载异常问题你知道答案吗?

开发辅助用到java反射机制动态加载jar文件以解析dubbo接口,实现无消费者情况下调试dubbo服务。在用户使用过程中发现解析接口一直停留在加载页面没有任何反应,日志也没看到任何异常信息。在开发时已经考虑了各种异常处理,所有操作异常都会打印日志,并toast提示异常信息,所以这个问题排查起来稍微困难些。

根据用户使用反馈,开发辅助提供了从指定文件夹中读取jar文件的功能。这里描述一下问题产生的场景:用户使用时只将服务api的jar包放在了指定文件夹,然后开始使用dubbo服务调试功能;当点击服务列表时,界面一直停留在加载中,如前面所描述的情况。所以模拟使用场景,仅将要调试的api包放入指定文件夹开始调试,最终定位到了问题所在,这里不直接说明问题,通过一个代码场景将问题抛出,主是就是JVM URLClassLoader类加载时异常处理问题。

下面通过一个demo示例来重现该问题,先来描述一下模拟api包的场景,假设下图为api项目。其中有两个类Model和Test,Model中仅有一个方法,方法参数为Test类,而Test类什么都没有,现将该项目打成jar包。

因为问题是class类缺失导致的,所以这里将打包好的ExceptionTest.jar中的Test.class类文件删除。删除之后如下图所示

下面新建一个测试项目,该项目只有一个包含main函数的类。具体代码如下图所示

注释1处jar文件路径是正确的,能正常读取jar文件;

注释2处将ExceptionTest.jar加载到URLClassLoader中;

注释3处通过URLClassLoader加载Model类;

注释4中通过反射获取Model类的方法。

那么问题来了,上图中main函数执行之后哪个System.out信息会输出?

You may also like...

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据