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字段确实包含已加载的类。

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

最佳答案

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


  第二种解决方案是使虚拟机“神奇”
  将这些新建的类加载器的类加载委托给
  他们的父加载器,而无需调用Java。的
  缺点是这是JVM中的另一种入侵。这个
  选项已被选择。

10-02 23:26