我有一些代码可以调用..
x = getClass().getClassLoader();
不过,这会返回null。
当我不是从Eclipse而是从命令行启动相同的代码时,它会返回一个类加载器。
我可以破解代码来做到这一点。
if (getClass().getClassLoader() == null)
{
x = ClassLoader.getSystemClassLoader().getSystemResourceAsStream( loadedPropFileName );
}
两者都是使用相同的JVM编译和运行的。(我99.99%确定)。
有人知道为什么第一个类加载器会返回null吗?
编辑:
我的问题是“有没有人知道为什么同一个类在通过Eclipse启动时会返回null,并且在从命令行加载时会返回一个类加载器。”
感谢您建议Bootstap装载器必须在Eclipse中装入类。我不知道为什么会发生这种情况。
发布于 2009-12-17 19:59:46
引用API doc:
某些实现可能使用null来表示引导类加载器。如果该类是由引导类加载器加载的,则此方法在此类实现中将返回null。
发布于 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。
发布于 2009-12-17 20:00:36
如果该类是由引导类加载器加载的,则此方法在此类实现中将返回null。
https://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Class.html#getClassLoader()
https://stackoverflow.com/questions/1921238
复制相似问题