A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张 涛 中级黑马   /  2012-9-13 16:56  /  3351 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

看代码:
  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?

6 个回复

倒序浏览
getClassLoader()
返回该类的类加载器。有些实现可能使用 null 来表示引导类加载器。如果该类由引导类加载器加载,则此方法在这类实现中将返回 null。
引导类加载器负责加载jdk中的系统类

如果此对象表示一个基本类型或 void,则返回 null。
回复 使用道具 举报
本帖最后由 程金 于 2012-9-13 21:20 编辑

extClassLoader的父类(楼主注意这里不是指继承)是BootstarpClassLoader,它负责加载虚拟机的核心类库,如java.lang.*等。根类加载器从系统属性()sun.boot.class.path所指定的目录中加载类库。Java虚拟机并不会向Java程序提供根类加载器的引用,而是用”null“来表示根类加载器,这样做是为了保护Java虚拟机的安全,防止黑客利用根类加载器来加载非法的类,从而破坏Java虚拟机的核心代码。
---------
第二个打印的该是ExtClassLoader,但我这里第二次取得的loader竟是null,why?
--用getParent()得到父加载类
回复 使用道具 举报
楼上说的对…根类从C++写的引导类加载器,所以JVM不允许程序员获取,保证虚拟机安全性
回复 使用道具 举报
可是这里第二个就是null了,第二个不是bootstrap,而是extclassloader
回复 使用道具 举报
张 涛 发表于 2012-9-13 20:57
可是这里第二个就是null了,第二个不是bootstrap,而是extclassloader

用getParent()得到父加载类
回复 使用道具 举报
还是不懂
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马