getClass().getClassLoader() 是 null,为什么?

2022-09-01 00:06:10

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

x = getClass().getClassLoader();

这将返回 null。

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

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

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

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

任何人都有任何想法,为什么第一个会为类装入器返回null?

编辑:

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

感谢您关于 Bootstap 加载程序必须在 Eclipse 中加载类的建议。我不知道为什么会发生这种情况。


答案 1

引用 API 文档

某些实现可能使用 null 来表示引导类装入器。如果此类是由引导类装入器装入的,则此方法将在此类实现中返回 null。


答案 2

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

如果类是从 Bootstrap 类路径加载的,即;jdk\jre\lib\rt.jar ,BootStrap ClassLoader 将被调用。

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

如果类是从应用程序类路径加载的,即;如 环境变量 中指定,应用程序类加载器称为 。

由于Bootstrap ClassLoader不是在java中实现的,它要么用c或c ++实现,所以没有引用它,这就是为什么它返回null。但是Extension和Application类Loader是用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。


推荐