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

jef*_*ter 35 java eclipse classloader

我有一些调用的代码..

x = getClass().getClassLoader();
Run Code Online (Sandbox Code Playgroud)

这会返回null.

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

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

if (getClass().getClassLoader() == null)
{
 x = ClassLoader.getSystemClassLoader().getSystemResourceAsStream( loadedPropFileName );
} 
Run Code Online (Sandbox Code Playgroud)

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

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

编辑:

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

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

Mic*_*rdt 34

引用API文档:

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

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

小智 9

这是它的工作原理.每当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.


Ita*_*man 5

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