我看过几个地方"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 { }
不应该声明clazz.getClassLoader()== mcl返回true吗?有人可以解释我在这里缺少的东西吗?
谢谢.
无论何时创建自己的类加载器,它都将附加在类加载器的树状层次结构中.要加载类,类加载器首先将加载委托给其父级.只有当所有父母都没有找到该类时,首先要求加载类的加载器才会尝试加载它.
在您的特定情况下,加载被委托给父类加载器.虽然您要求MyClassLoader加载它,但它是进行加载的父级.在这种情况下,它是AppClassLoader.
引用ClassLoader的API文档:
ClassLoader的每个实例都有一个关联的父类加载器.当请求查找类或资源时,ClassLoader实例会在尝试查找类或资源本身之前,将对类或资源的搜索委托给其父类加载器.