Java基础加强之类加载器

发表于:2013-12-23 10:44

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:lovecx24    来源:51Testing软件测试网采编

  学习概述:本模块深入讲解了Java类加载方面的知识,Java类加载器和类加载机制以及类加载原理
  学习目标:掌握类加载机制和原理,能够独立开发自己的类加载器。
  1.类的加载
  什么是类加载? 类加载是指将类的class文件读入内存,并为之创建一个Java.lang.Class对象,也就是说当程序中使用任何类时,系统都会为之建立一个java.lang.Class对象。
  类加载器负责加载所有类,系统为所有被载入内存中的类生成一个java.lang.Class实例。一旦一个类被载入JVM中,同一个类不会再被再次载入。
  思考问题:怎么样才算同一个类?
  当JVM启动时,会形成三个类加载器组成的原始类加载器层次结构:
  【BootStrap ClassLoader】根类加载器 这是一个特殊的加载器,他并不是有Java编写,而是JVM自身实现的
  【Extension Classloader】扩展类加载器
  【System Classloader】系统类加载器
  类加载器的父子关系:
  实验获得类加载器以及了解类加载器的层次结构:
public  class ClassloaderDemo{
public static  void main(String[] args){
System.out.printlb(ClassLoaderDemo.class.getClassLoader().getName());
System.out.println(System.class.getClassloader());
ClassLoader classloader = ClassLoaderDemo.class.getClassLoader());
while(loader!=null){
System.out.println(loader.getClass().getName());
loader=loader.getParent();
}
}
  注意:程序会抛出异常,因为JVM根类加载器不是Java类。
  2.类的加载机制,如图所示:
  <1>全盘负责:所谓全盘负责,就是说当一个类加载器负责加载某个Class的时候,该Class所依赖的和引用的其他Class也将由该类加载器负责载入,除非显式使用另外一个                            类加载器来实现载入。
  <2>父类委托:意思是先让父类加载器试图加载该Class,只有父类加载器无法加载该类是才尝试从自己的路径中加载该类。
  <3>缓存机制:缓存机制将会保证所有被加载过的Class都会被缓存,当程序中需要使用某个Class时,类加载器先从缓存中搜索该Class,只有当缓存中不存在该Class对象              时,系统才重新读取该类对应的二进制数据。这就是为什么我们修改Class后,JVM必须重新启动,修改才生效的原因。
  类加载器的父子关系:用户类加载器—>系统类加载器—>扩展类加载器—>根类加载器
  类加载机制:
  <1>当JVM需要加载一个类是,到底指派哪个类加载器去加载呢?
  首先当前线程的类加载器去加载线程中的第一个类,如果A类中引用了B类,JVM将使用加载A类的加载器来加载B类,最后还可以调用ClassLoader。loadeClass方法指定        某个类加载器去加载某个类。
  <2>每个类加载器在加载类时,先委托给其上级加载器。
  注意两点:
  当所有的祖宗类加载器都没有加载到类,回到发起类加载器,还加载不了,那么程序将抛出ClassNotFoundExcetpion,而不是去找发起类加载器的儿子,因为没有                     getChild ()方法,即使有,那么选择哪一个儿子加载器呢?
  面试题:能不能自己写一个类叫Java.lang.System?
  答案:可以写,但是因为JVM委托机制的存在,会先找到JVM根类加载器,我自己写也可以,那么我要抛开委托加载机制,我自己指定一个ClassLoader。
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号