ClassLoader混淆

Eyv*_*ind 10 java classloader

我看过几个地方"Class.getClassLoader()返回用于加载该特定类的ClassLoader",因此,我对以下示例的结果感到困惑:


package test;

import java.lang.*;

public class ClassLoaders { 
    public static void main(String[] args) throws java.lang.ClassNotFoundException{
      MyClassLoader mcl = new MyClassLoader();
      Class clazz = mcl.loadClass("test.FooBar");
      System.out.println(clazz.getClassLoader() == mcl); // prints false
      System.out.println(clazz.getClassLoader()); // prints e.g. sun.misc.Launcher$AppClassLoader@553f5d07
    }
}

class FooBar { }

class MyClassLoader extends ClassLoader { }
Run Code Online (Sandbox Code Playgroud)

不应该声明clazz.getClassLoader()== mcl返回true吗?有人可以解释我在这里缺少的东西吗?

谢谢.

paw*_*que 17

无论何时创建自己的类加载器,它都将附加在类加载器的树状层次结构中.要加载类,类加载器首先将加载委托给其父级.只有当所有父母都没有找到该类时,首先要求加载类的加载器才会尝试加载它.

在您的特定情况下,加载被委托给父类加载器.虽然您要求MyClassLoader加载它,但它是进行加载的父级.在这种情况下,它是AppClassLoader.


Mic*_*rdt 6

引用ClassLoaderAPI文档:

ClassLoader的每个实例都有一个关联的父类加载器.当请求查找类或资源时,ClassLoader实例会在尝试查找类或资源本身之前,将对类或资源的搜索委托给其父类加载器.