loader.loadClass("java.util.ArrayList");
Class cls4=loader.findLoadedClass("java.util.ArrayList");
if(cls4==null)
System.out.println("cls4==null");结果输出为null, 我不明白明明已经把ArrayList装入ClassLoader了,但是调用findLoadedClass(),还是返回一个null值。分不多了,希望有高手能解释一下。

解决方案 »

  1.   

    findLoadedClass这个方法是protected的
    不是这个loader加载的
      

  2.   

    java.util.ArrayList是系统类库 是由bootup classloader加载的System.out.println(ArrayList.class.getClassLoader());你可以试试
      

  3.   

    http://blog.csdn.net/hbhbhbhbhb1021/archive/2006/08/09/1043060.aspx
      

  4.   

    Class cls = Class.forName("java.util.ArrayList");看看cls 为空么,肯定不为空,因为boot 级ClassLoader已经加载这个类了
      

  5.   

    TO interpb:   我改成 
    loader.loadClass("org.springframework.orm.hibernate.support.HibernateDaoSupport");
        loader.loadClass("TBean");
    Class cls4=loader.findLoadedClass("org.springframework.orm.hibernate.support.HibernateDaoSupport");cls4一样为null还有,我在程序中加上这句:
    loader.loadClass("java.util.ArrayList");
    System.out.println("classloader which loads ArrayList:"+java.util.ArrayList.class.getClassLoader());显示结果为null
      

  6.   

    TO treeroot;  我的类是这样写的:
    public class MyClassLoader extends ClassLoader
    {
     .............}所以可以调用protected 修饰的findLoadedClass()
      

  7.   

    我再写了一段测试代码,public static void main(String[] args) throws Exception
    {  
    //ArrayList list=new ArrayList();
        
    MyClassLoader loader=new MyClassLoader();
    ClassLoader sysloader=loader.getSystemClassLoader();
      
    loader.loadClass("org.springframework.orm.hibernate.support.HibernateDaoSupport");
        loader.loadClass("org.springframework.orm.hibernate.support.OpenSessionInViewFilter");
        loader.loadClass("java.util.ArrayList");
        
    ClassLoader loader1=org.springframework.orm.hibernate.support.HibernateDaoSupport.class.getClassLoader();
    ClassLoader loader2=org.springframework.orm.hibernate.support.OpenSessionInViewFilter.class.getClassLoader();
    ClassLoader loader3=java.util.ArrayList.class.getClassLoader();
    System.out.println("****hashcode of loader:"+loader.hashCode()+"********");
    System.out.println("****hashcode of sysloader:"+sysloader.hashCode()+"********");
    System.out.println("****hashcode of loader1:"+loader1.hashCode()+"********");
    System.out.println("****hashcode of loader2:"+loader2.hashCode()+"********");
    System.out.println("the hascode of classloader whiche loads ArrayList:"+loader3.hashCode());
       
    }出来的结果是:
    ****hashcode of loader:1027049********
    ****hashcode of sysloader:17105257********
    ****hashcode of loader1:17105257********
    ****hashcode of loader2:17105257********
    java.lang.NullPointerException
    at classloader.MyClassLoader1.main(MyClassLoader1.java:30)
    Exception in thread "main" 证明了加载spring类的ClassLoader是systemClassloader,而ArrayList的ClassLoader则为null, 后来我加上ArrayList list=new ArrayList()实例化后,也是为null,这个问题就比较奇怪了。
      

  8.   

    null 就表示 这个类的classloader是 Bootstrap classloader因为这classloader 是用本地语言编写的所以 Java里面没有这个loader的引用 所以为null所有的Java 核心类都是Bootstrap classloader 加载的 , 也就是rt.jar里面的类你可以试试 java.lang.Xxxx,等等的loader都是null
      

  9.   

    还有一个问题,问完就结贴,为什么我用自定义的loader loader spring的类进去,但是发现spring的类不在loader中,而在systemClassLoader中呢?
      

  10.   

    classloader的工作机制是委托加载的每个classloader加载类的时候会先把加载类的请求发给它的委托父类这个过程一直递归下去,只到这个loader所有的直接或间接父loder都不能加载时才由它自己加载这个类你可以调用这个loader的getParent(方法名我记不清了)方法 得到它的父loader你可以看看loader的体系方面的文章会对你有帮助