我见过几个地方"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吗?有人能解释一下我在这里遗漏了什么吗?
谢谢。
发布于 2009-04-03 11:28:16
每当您创建自己的类加载器时,它都会附加在类加载器的树状层次结构中。要装入一个类,类加载器首先将装入委托给它的父类。只有当所有的父类都没有找到这个类时,首先被要求加载一个类的加载器才会尝试加载它。
在您的特定情况下,加载被委托给父类加载器。尽管您要求MyClassLoader加载它,但执行加载的是父进程。在本例中,它是AppClassLoader。
发布于 2009-04-03 11:29:35
引用API doc of ClassLoader
每个ClassLoader实例都有一个关联的父类加载器。当被请求查找类或资源时,ClassLoader实例将在尝试查找类或资源本身之前将对类或资源的搜索委托给它的父类加载器。
发布于 2009-04-03 11:27:35
如果自定义的类加载器将调用委托给VM的类加载器,则由谁加载类。clazz.getClassLoader()将返回这个类加载器。
为了深入了解细节:ClassLoader类的Javadoc提供了以下对执行步骤顺序的解释:
使用指定的二进制名称加载该类。此方法的默认实现按以下顺序搜索类:
由于您继承的方法没有更改,因此此行为将保持不变。步骤2将是加载类的步骤。当您调用ClassLoader的无参数构造函数(自动,因为您没有在MyClassLoader中定义构造函数)时,您会自动使用内置的ClassLoader。
https://stackoverflow.com/questions/713540
复制相似问题