背景:
项目代码中有用到一个自己定义的URLClassLoader类来通过网络加载jar包。不同的jar包通过传入的参数来决定。
问题:
今天遇到的一个问题是:通过debug程序发现加载的jar包中的类和传入的参数对不上。仔细看了下参数是没有传错的。
debug过程:
一、首先看通过网络传回来的jar包的数据对不对的上。
用postman根据url下载下来jar包,利用反编译工具查看
发现URL传回来的jar包是对的。
也就是说自定义的URLClassLoader类从不知道哪加载了类回来
二、从代码中debug,看究竟从哪加载了这个类进来
从代码中来看,这个classLoader就是我写的那个URLClassLoader
一路debug进来到ClassLoader类这里,我们知道JVM加载类的方法是所谓的“双亲委派“,简单来说就是类加载器加载类的时候会先让它的父类加载器去尝试加载,如果加载不了才会自己去加载。可参考ClassLoader类的loadClass(String name, boolean resolve)方法,它的逻辑是先调用parent的loadClass方法,如果返回为空,再调用自己的findClass方法。
问题就出现在这里,自定义的URLClassLoader的父类其实就是AppClassLoader,而AppClassLoader负责加载的jar包和class文件是classpath中指定的类。debug到这里返回后发现返回的结果不为空,也就是说AppClassLoader加载到了我需要的类!
看了下代码,原来我项目下有一个同样的类路径下的类,这是因为在开发其他功能的时候先放在这的。没想到坑了自己。。。
解决方法:
1.删除项目下的类或者改名字