当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《getClass().getClassLoader()为null,为什么?》经验,为你挑选了3个好方法。

我有一些调用的代码..

x = getClass().getClassLoader();

这会返回null.

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

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

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

两者都使用相同的JVM进行编译和运行.(我99.99%肯定).

任何人都有任何想法为什么第一个将为类加载器返回null?

编辑:

我的问题是"任何人都有任何想法为什么同一个类在从Eclipse启动时返回null,从命令行加载时是类加载器."

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



1> Michael Borg..:

引用API文档:

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


是的,但如果实现相同,为什么命令行和Eclipse中的行为不同.我认为这是OP真正要求的......
如果他想知道与他要求的不同的东西,他为什么不问他真正想知道什么?

2> 小智..:

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

如果从Bootstrap ClassPath加载Class,即; jdk\jre\lib\rt.jar,将调用BootStrap ClassLoader.

如果从Extension Classpath加载Class,即; jdk\jre\lib\ext*.jar,将调用Extension ClassLoader.

如果从Application ClassPath加载Class,即; 在Environment Variable中指定,调用Application 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.



3> Itay Maman..:

"如果此类由引导类加载器加载,则此方法将在此类实现中返回null." http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Class.html#getClassLoader()

推荐阅读
Chloemw
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有