黑马程序员技术交流社区

标题: classLoader的问题 [打印本页]

作者: 张 涛    时间: 2012-9-13 16:56
标题: classLoader的问题
看代码:
  1. public class ClassLoaderTest {

  2.         public static void main(String[] args) {
  3.                 ClassLoader loader = ClassLoaderTest.class.getClassLoader();
  4.                 System.out.println(loader.getClass().getName());
  5.                
  6.                 loader = loader.getClass().getClassLoader();//这一个loader就是null了。
  7.                 if(loader != null){
  8.                         System.out.println(loader.getClass().getName());
  9.                
  10.                         loader = loader.getClass().getClassLoader();
  11.                         if(loader != null)
  12.                                 System.out.println(loader.getClass().getName());
  13.                 }
  14.         }
  15. }
复制代码
第一个打印的是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