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

时间:2009-12-17 11:52:36

标签: java eclipse classloader

我有一些调用的代码..

x = getClass().getClassLoader();

但这会返回null。

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

我可以破解代码来执行此操作...

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

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

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

编辑:

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

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

8 个答案:

答案 0 :(得分:31)

引用API doc

  

某些实现可能使用null   代表引导类加载器。   此方法将返回null   如果这个类是实现的   由bootstrap类加载器加载。

答案 1 :(得分:7)

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

答案 2 :(得分:5)

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

答案 3 :(得分:3)

有一点可以肯定,与从命令行运行时相比,Eclipse具有更深入,更复杂的类加载器设置。如果你看到一个类的类加载器在一个类别中出现的差异,那么这很可能就是原因。

我不知道Eclipse究竟在做什么但是我认为你的类很可能是从Eclipse运行时由引导程序类加载器而不是而Eclipse正在尝试制作它似乎就是这样。

一旦应用程序被引导,引导程序ClassLoader就是静态的,除非Eclipse已经覆盖了实现,否则你不能在以后添加jar或类...在这种情况下,还有另一种可能的解释。

答案 4 :(得分:0)

我有同样的问题。但是使用以下方法解决了它: -

<ClassName>.class.getClass().getResource(urlString);

希望这有助于其他人......

答案 5 :(得分:0)

“如果此类由引导类加载器加载,则此方法将在此类实现中返回null。” - getClassLoader()

中的JavaDoc

为了安全起见,null类加载器是为系统类保留的,只能在Class.forName(String name,boolean initialize,ClassLoader loader)中使用。如果类具有null ClassLoader,则不会进行大多数安全检查。

答案 6 :(得分:0)

有类似的问题。通过不使用getClass方法解决。以下对我有用。

<ClassName>.class.getClassLoader();

答案 7 :(得分:0)

为了了解Eclipse在类路径设置方面的确切作用,在启动应用程序时,单击应用程序类路径设置下的“显示命令行”按钮可能会有所帮助。 (我正在使用Eclipse 2020-06)。 对我来说,它表明jar文件包含调用<ClassName>.class.getClassLoader();的类 返回null, 实际上是
之前 -Xbootclasspath / a: