关于ClassLoader的问题
最近在看ClassLoader,有个问题,我自定义了一个ClassLoader,是扩展自URLClassLoader的,它的父ClassLoader是AppClassLoader,其中重写了findClass和loadclass两个方法,重写的时候仍然是,先在ClassLoader中查找是否已经加载,没有加载,代理给父类加载,父类没有加载,然后就自己加载,在主线程中,重启了一个线程,而且用Thread的setClassLoader方法,把我自定义的ClassLoader设置为这个线程的ClassLoader,用显示的类加载方法,可以加载我自定义的一些类,但是如果用隐式的方式,也就是来new这个类的一个实例,或者用加载的class来创建这个类的一个实例,也就是用class类的newInstance()方法,用反射是可以调用类的方法的, 就不能加载,就会抛出NoClassDefFoundError这个错误(这自定义的类,不在classpath里面,但是在我自定义的ClassLoader的查找的url里面),出现这个问题的原因是这个问题。
但是我看那些Servlet容器,应用服务器,像Tomcat,定义了很多的ClassLoader,不同的ClassLoader负责不同的路径类的加载,在我们定义的Servlet,jsp里面是可以来new自定义的类的实例的,而这些类也并不在classpath中。