我已经看到“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。