类加载器和委托机制

java虚拟机中可以安装多个列加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:
BootStrap ExtClassLoader AppClassALoader

public class ClassLoaderDemo01 {
public static void main(String[] args) {
System.out.println(ClassLoaderDemo01.class.getClassLoader().getClass()
.getName());
}
}

运行结果是:sun.misc.Launcher$AppClassLoader

System.out.println(System.class.getClassLoader());

输入结果是null.说明System的类加载器是BootStrap

1.得出类加载器的关系图

ClassLoader loader = ClassLoaderDemo01.class.getClassLoader();
while (loader != null) {
System.out.println(loader.getClass().getName());
loader = loader.getParent();
}
System.out.println(loader);

输出的结果是:
sun.misc.Launcher$AppClassLoader
sun.misc.Launcher$ExtClassLoader
null

这样可以得出类加载器的关系图:BootStrap ExtClassLoader AppClassALoader
2.如何将自己写的类使用ExtClassLoader加载
ClassLoaderDemo01 本来的类加载器是AppClassALoader,现在我们使用ExtClassLoader 来加载。
将Demo01输入到JDK->JRE->lib->ext目录下,重新运行,可以发现,这时候加载的类加载器为:ExtClassLoader

BootStrap(加载JRE/lib/rt.jar)
ExtClassLoader(加载JRE/lib/ext/*.jar)
AppClassALoader(加载classpath指定的所有jar和目录)

3.当我们的源程序用到了一个类,这时候,我们应该用哪个内加载器去加载呢?
(1)首先派当前线程的类加载器去加载第一个类。每个线程都有一个叫做上下文加载器,set/getContextClassLoader,你可以为这个线程指定一个类加载器.这个线程遇到了某个类,就派这个类加载器去加载.
(2)如果类A中引用了类B,java虚拟机将使用加载类A的类加载器来加载类B.
(3)还可以直接调用ClassLoader.loadClass()方法来指定某个类加载器去加载某个类.

每个类加载器加载类时,
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值