Java 类加载器混乱

Java 类加载器混乱,java,classloader,Java,Classloader,我在几个地方见过“Class.getClassLoader()返回用于加载该特定类的类加载器”,因此,我被以下示例的结果难住了: package test; import java.lang.*; public class ClassLoaders { public static void main(String[] args) throws java.lang.ClassNotFoundException{ MyClassLoader mcl = new MyCla

我在几个地方见过“Class.getClassLoader()返回用于加载该特定类的类加载器”,因此,我被以下示例的结果难住了:


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吗?有人能解释一下我遗漏了什么吗


谢谢。

如果自定义类加载器将调用委托给VM的类加载器,则由后者加载该类。getClassLoader()将返回这个类加载器

详细说明:该类的Javadoc对执行步骤的顺序提供了以下解释:

使用指定的 二进制名称。默认值 该方法的实现 对于按以下顺序排列的类:

  • 调用findLoadedClass(字符串)检查该类是否已被删除 上膛了
  • 在父类加载器上调用loadClass方法。如果父母是 将内置于 而是使用虚拟机
  • 调用findClass(String)方法来查找该类

  • 当您在不更改方法的情况下继承时,此行为将保持不变。第2步是加载类的步骤。当您调用类加载器的无参数构造函数时(自动,因为您没有在MyClassLoader中定义构造函数),您会自动使用内置的类加载器。

    每当您创建自己的类加载器时,它都会附加在类加载器的树状层次结构中。要加载类,类加载器首先将加载委托给其父类。只有当所有家长都没有找到类时,第一个被要求加载类的加载程序才会尝试加载它

    在您的特定情况下,加载被委托给父类加载器。尽管您要求MyClassLoader加载它,但加载的是父级。在本例中,它是AppClassLoader。

    引用:

    ClassLoader的每个实例都有一个 关联的父类加载器。什么时候 请求查找类或资源, 类加载器实例将委托 对类或资源的搜索 到它的父类加载器之前 正在尝试查找类或 资源本身


    事实上,它首先要求其父级在尝试自己查找类之前找到该类。Michael,Java SE这样定义它,但Java EE建议实现其他类加载器……该示例还使用了无args类加载器构造函数:“使用getSystemClassLoader()方法返回的类加载器创建一个新的类加载器”(奇怪的向后兼容行为)添加System.out.println(clazz.getClassLoader()==mcl.getParent())//返回真值。。。如果mcl是一个普通的Webapp类加载器,并且test.FooBar类可用于Webapp,因为Webapp类加载器颠倒了java.lang以外的任何内容的优先级,那么thanksIt将如预期的那样工作。很高兴看到您是如何编写MyClassLoader的。参见我在上的示例