我已经看到“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?有人可以解释我在这里想念的东西吗?

谢谢。

最佳答案

每当您创建自己的类加载器时,它将被附加到树形的类加载器层次结构中。要加载一个类,类加载器首先将加载委托(delegate)给它的父类。只有当所有 parent 都没有找到该类时,才被要求首先加载一个类的加载器将尝试加载它。

在您的特定情况下,将加载委托(delegate)给父类加载器。尽管您要求MyClassLoader进行加载,但由父级进行加载。在这种情况下,它是AppClassLoader。

09-25 20:19