getClass().getClassLoader() 为空,为什么?

新手上路,请多包涵

我有一些代码可以调用..

 x = getClass().getClassLoader();

虽然这会返回 null。

当我不是从 Eclipse 而是从命令行启动相同的代码时,它返回一个类加载器。

我可以破解代码来做到这一点……

 if (getClass().getClassLoader() == null)
{
 x = ClassLoader.getSystemClassLoader().getSystemResourceAsStream( loadedPropFileName );
}

两者都使用相同的 JVM 编译和运行。 (我有 99.99% 的把握)。

任何人都知道为什么第一个会为类加载器返回 null?

编辑:

我的问题是“任何人都知道为什么同一个类在通过 Eclipse 启动时会返回 null,而在从命令行加载类加载器时会返回 null。”

感谢 Bootstap 加载程序必须在 Eclipse 中加载类的建议。我不知道为什么会这样。

原文由 jeff porter 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

引用 API 文档

一些实现可能使用 null 来表示引导类加载器。如果此类由引导类加载器加载,则此方法将在此类实现中返回 null。

原文由 Michael Borgwardt 发布,翻译遵循 CC BY-SA 2.5 许可协议

这就是它的工作原理。每当 JVM 尝试加载任何类时,它都会检查以下条件。

如果 Class 是从 Bootstrap ClassPath 加载的,即; jdk\jre\lib\rt.jar , BootStrap ClassLoader 会被调用。

如果类是从扩展类路径加载的,即; jdk\jre\lib\ext*.jar , Extension ClassLoader 会被调用。

如果 Class 是从 Application ClassPath 加载的,即;按照环境变量中的指定,应用程序类加载器被调用。

由于 Bootstrap ClassLoader 不是在 java 中实现的,它是在 c 或 c++ 中实现的,所以没有对它的引用,这就是它返回 null 的原因。但是扩展和应用程序类加载器是用 java 编写的,因此您将获得 sun.misc.Launcher\(ExtClassLoader@someHexValue 和 sun.misc.Launcher\)AppClassLoader@someHexValue 的引用。

所以,如果你做这样的事情 System.out.println(String.class.getClassLoader()) 你会得到 null 因为这个类被 BootStrap ClassLoader 调用,另一方面,如果你对一个类做同样的事情Ext 或 App Class 路径你将分别得到 \(ExtClassLoader@someHexValue 和 sun.misc.Launcher\)AppClassLoader@someHexValue 。

原文由 Satyendra 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题