关于ClassLoader的问题

06-08-29 xdlhj2005
    

最近在看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中。

    

banq
2006-09-07 10:17

1.当低一级的类加载器需要定位一个类。它会将这个任务委托给父一级类加载器 。

2.使每个类加载器会先让它的父一级的类加载器搜索需要的类。只有当父一级的类加载器没有找到。才会让子一级的类加载器为它自己搜索所需的类

3.父加载器是无法看到子加载器加载的类,如果Foo 被B加载时,而Foo依赖于Baz,那么Baz也必须被A或B加载,如果Baz被C或D加载, ClassNotFoundException将被报错。

4.如果Baz被C和D同时加载,每个加载器有自己的Baz实例,两个实例类型不兼容。