我有一些调用的代码..
x = getClass().getClassLoader();
这会返回null.
当我从Eclipse启动相同的代码而不是命令行时,它返回一个类加载器.
我可以破解代码来做到这一点......
if (getClass().getClassLoader() == null) { x = ClassLoader.getSystemClassLoader().getSystemResourceAsStream( loadedPropFileName ); }
两者都使用相同的JVM进行编译和运行.(我99.99%肯定).
任何人都有任何想法为什么第一个将为类加载器返回null?
编辑:
我的问题是"任何人都有任何想法为什么同一个类在从Eclipse启动时返回null,从命令行加载时是类加载器."
感谢Bootstap加载器必须在Eclipse中加载类的建议.我不知道为什么会这样.
引用API文档:
某些实现可能使用null来表示引导类加载器.如果此类由引导类加载器加载,则此方法将在此类实现中返回null.
这是它的工作原理.每当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.
"如果此类由引导类加载器加载,则此方法将在此类实现中返回null." http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Class.html#getClassLoader()