黑马程序员技术交流社区
标题:
classLoader的问题
[打印本页]
作者:
张 涛
时间:
2012-9-13 16:56
标题:
classLoader的问题
看代码:
public class ClassLoaderTest {
public static void main(String[] args) {
ClassLoader loader = ClassLoaderTest.class.getClassLoader();
System.out.println(loader.getClass().getName());
loader = loader.getClass().getClassLoader();//这一个loader就是null了。
if(loader != null){
System.out.println(loader.getClass().getName());
loader = loader.getClass().getClassLoader();
if(loader != null)
System.out.println(loader.getClass().getName());
}
}
}
复制代码
第一个打印的是AppClassLoader,正确。
第二个打印的该是ExtClassLoader,但我这里第二次取得的loader竟是null,why?
第三个打印的无从验证,但不应该这样“loader.getClass().getClassLoader()”去获取第三个loader吗?视频上怎么是“loader.getParent()”来获取的第三个loader?
作者:
马睿
时间:
2012-9-13 18:52
getClassLoader()
返回该类的类加载器。有些实现可能使用 null 来表示引导类加载器。如果该类由引导类加载器加载,则此方法在这类实现中将返回 null。
引导类加载器负责加载jdk中的系统类
如果此对象表示一个基本类型或 void,则返回 null。
作者:
程金
时间:
2012-9-13 19:15
本帖最后由 程金 于 2012-9-13 21:20 编辑
extClassLoader的父类(楼主注意这里不是指继承)是BootstarpClassLoader,它负责加载虚拟机的核心类库,如java.lang.*等。根类加载器从系统属性()sun.boot.class.path所指定的目录中加载类库。Java虚拟机并不会向Java程序提供根类加载器的引用,而是用”null“来表示根类加载器,这样做是为了保护Java虚拟机的安全,防止黑客利用根类加载器来加载非法的类,从而破坏Java虚拟机的核心代码。
---------
第二个打印的该是ExtClassLoader,但我这里第二次取得的loader竟是null,why?
--用getParent()得到父加载类
作者:
马睿
时间:
2012-9-13 19:52
楼上说的对…根类从C++写的引导类加载器,所以JVM不允许程序员获取,保证虚拟机安全性
作者:
张 涛
时间:
2012-9-13 20:57
可是这里第二个就是null了,第二个不是bootstrap,而是extclassloader
作者:
程金
时间:
2012-9-13 21:18
张 涛 发表于 2012-9-13 20:57
可是这里第二个就是null了,第二个不是bootstrap,而是extclassloader
用getParent()得到父加载类
作者:
张 涛
时间:
2012-9-14 09:53
还是不懂
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2