其实就是很简单的一个自定义ClassLoader
@Override
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
Class result = null;
.....
result = super.loadClass(name); //问题出在这里
if (resolve) {
super.resolveClass(result);
}
return result;
很快速的就写完了,但是一运行,就发现线程的堆栈都溢出了。

为什么一直调用ClassLoader的loadClass方法啊,为什么两个方法互相来回调用啊。
看看ClassLoader的loadClass方法:

这里会调用loadClass(String name, boolean resolve),但是这个方法就是我们自己重载的方法啊,这样就出现死循环了。
loadClass(String name, boolean resolve) -> super.loadClass(String name) -> loadClass(String name, boolean resolve) ...
怎么解决呢,其实很简单,调用父类的同参数的方法就好
loadClass(String name, boolean resolve) -> super.loadClass(String name, boolean resolve) 这样就好了。
@Override
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
Class result = null;
.....
result = super.loadClass(name,false); //加个参数false就解决了
if (resolve) {
super.resolveClass(result);
}
return result;
网友评论