Java 类加载器混乱
我在几个地方见过“Class.getClassLoader()返回用于加载该特定类的类加载器”,因此,我被以下示例的结果难住了: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
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对执行步骤的顺序提供了以下解释: 使用指定的 二进制名称。默认值 该方法的实现 对于按以下顺序排列的类:
当您在不更改方法的情况下继承时,此行为将保持不变。第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的。参见我在上的示例