欢迎使用CSDN-markdown编辑器

来源:互联网 发布:php 模拟微信浏览器 编辑:程序博客网 时间:2024/05/22 11:33

类加载器
1. 引导类加载器(bootstrap class loader),用来加载java的核心库(java_home/jre/lib/rt.jar),是用原生代码来实现的,并不继承自java.lang.ClassLoader,用C语言编写的核心类库包
2. 继承ClassLoader类的子类,ClassLoader生成相应的字节码文件,加载java需要的资源,如图片文件,配置文件

    1. 扩展加载器(extensions class loader),用来加载java的扩展库(java_home/jre/ext/*.jar),java虚拟机的实现会提供一个扩展库目录,该类加载器在此目录里面查找并加载java类,用java语言编写的核心类库,由sun.misc.Launcher$ExtClassLoader实现    2. 应用程序加载器(application class loader),根据java应用的类路径(classpath,java.class.path路径),一般来说,java应用的类都是由它来完成加载的,由sun.misc.launcher$AppClassLoader实现,由java语言编写(编译运行的时候加载的自定义类,以及类中的其他jar包的类)    3. 自定义类加载器,开发人员通过继承java.lang.ClassLoader类的方式实现自己的类加载器,以满足一些特殊的需求,由java语言编写(User.class,就是一种自定义类加载器)3. 类加载的顺序    1. 自定义java核心类库是不会加载成功,例如java.lang.String自定义是失败的,java虚拟机不会加载自定义的该类,而是由引导类加载器加载核心类库中已经存在的java.lang.String类    2. 类加载,双亲类加载机制,类由父类优先加载,父类加载不了交由子类加载,此方法保证了系统的类库不能被用户自定义,就算自定义了也是没有效果,因为系统核心类库由引导类加载器或者扩展加载器加载,定义一样的,系统自动认为是系统核心类库,所以没有效果。也是一种防止核心类库被修改机制。    3. 还有一种加载机制,Tomcat服务器等是使用这种加载器加载,加载类由子类优先加载,子类加载不了再交于父类加载。    4. 加载过程中会先检查类是否被已加载,检查顺序是自底向上,从Custom ClassLoader到BootStrap ClassLoader逐层检查,只要某个classloader已加载就视为已加载此类,保证此类只所有ClassLoader加载一次。而加载的顺序是自顶向下,也就是由上层来逐层尝试加载此类。