首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >getClass().getClassLoader()为空,为什么?

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

Stack Overflow用户
提问于 2009-12-17 19:52:36
回答 8查看 32.8K关注 0票数 44

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

代码语言:javascript
运行
复制
x = getClass().getClassLoader();

不过,这会返回null。

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

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

代码语言:javascript
运行
复制
if (getClass().getClassLoader() == null)
{
 x = ClassLoader.getSystemClassLoader().getSystemResourceAsStream( loadedPropFileName );
} 

两者都是使用相同的JVM编译和运行的。(我99.99%确定)。

有人知道为什么第一个类加载器会返回null吗?

编辑:

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

感谢您建议Bootstap装载器必须在Eclipse中装入类。我不知道为什么会发生这种情况。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2009-12-17 19:59:46

引用API doc

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

票数 37
EN

Stack Overflow用户

发布于 2015-09-26 13:22:42

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

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

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

如果类是从应用程序ClassPath加载的,即在环境变量中指定的,则调用应用程序ClassLoader。

由于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。

票数 15
EN

Stack Overflow用户

发布于 2009-12-17 20:00:36

如果该类是由引导类加载器加载的,则此方法在此类实现中将返回null。

https://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Class.html#getClassLoader()

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1921238

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档