为什么我不能从sun.misc.DelegatingClassLoader中查找类

时间:2015-03-17 08:25:02

标签: java classloader

From this question,我发现不可能从sun.misc.DelegatingClassLoader查找一个类,即在自己的类加载器上查找类,如

Class<?> accessor = ...
accessor.getClassLoader().findClass(accessor.getName());

抛出ClassNotFoundException。委托类加载器用于加载运行时生成的访问器类,以便将Java的反射JNI调用转换为Java调用。

由于一些奇怪的原因,我是not able to find the source of the DelegatingClassLoader anywhere in the JDK sources,即使它在我的构建中显然可用,它看起来是类标准ClassLoader的子类的空实现查看类的字节代码

如果DelegatingClassLoader实际上只是一个简单的子类,我不明白为什么不能通过名称查找类。是否涉及一些VM魔术?好像是

private native final Class<?> findLoadedClass0(String name);

方法不会返回DelegatingClassLoader的已加载类。但是,私有classes字段包含已加载的类。

我无法找到有关这些类加载器应该如何与其他类加载器不同的任何信息。我正在寻找一个解释为什么上面的查找不起作用但引发异常。

1 个答案:

答案 0 :(得分:1)

DelegatingClassLoader的来源无论出于何种原因都位于ClassDefiner.java。有趣的是,这段代码有一个引用bug 4474172的注释,这表明这个类加载器是JVM已知的,并且有特殊的行为:

  

第二种解决方案是使虚拟机“神奇地”#34;   为这些新制造的类加载器委托类加载   他们的父装载者,没有向Java打电话。该   缺点是这是JVM中的另一个黑客[...]。这个   已经选择了选项。