类加载器ClassLoader
来源:互联网 发布:破解版软件网站 编辑:程序博客网 时间:2024/04/27 17:16
类加载器ClassLoader
基本介绍
与普通程序不同的是。Java程序(class文件)并不是本地的可执行程序。当运行Java程序时,首先运行JVM(Java虚拟机),然后再把Java class加载到JVM里头运行,负责加载Java class的这部分就叫做Class Loader。
JVM本身包含了一个ClassLoader称为
Bootstrap ClassLoader
,和JVM一样,Bootstrap ClassLoader
是用本地代码实现的,它负责加载核心JavaClass(即所有java.*
开头的类)。另外JVM还会提供两个ClassLoader,它们都是用Java语言编写的,由Bootstrap ClassLoader
加载;其中Extension ClassLoader
负责加载扩展的Javaclass(例如所有javax.*
开头的类和存放在JRE的ext目录下的类),ApplicationClassLoader
负责加载应用程序自身的类。当运行一个程序的时候,JVM启动,运行
BootstrapClassloader
,该ClassLoader加载java核心API(ExtClassLoader
和AppClassLoader
也在此时被加载),然后调用ExtClassLoader
加载扩展API,最后AppClassLoader
加载CLASSPATH
目录下定义的Class,这就是一个程序最基本的加载流程。什么时候JVM会使用ClassLoader加载一个类呢?
当你使用java去执行一个类,JVM使用
ApplicationClassLoader
加载这个类;然后如果类A引用了类B,不管是直接引用还是用Class.forName()引用,JVM就会找到加载类A的ClassLoader,并用这个ClassLoader来加载类B。JVM按照运行时的有效执行语句,来决定是否需要装载新类,从而装载尽可能少的类,这一点和编译类是不相同的。似乎JVM自身的ClassLoader已经足够了,为什么我们还需要创建自己的ClassLoader呢?
因为JVM自带的ClassLoader只是懂得从本地文件系统加载标准的java class文件,如果编写你自己的ClassLoader,你可以做到:
在执行非置信代码之前,自动验证数字签名
动态地创建符合用户特定需要的定制化构建类
从特定的场所取得java class,例如数据库中
事实上当使用Applet的时候,就用到了特定的ClassLoader,因为这时需要从网络上加载java class,并且要检查相关的安全信息。
应用服务器大都使用了ClassLoader技术,即使你不需要创建自己的ClassLoader,了解其原理也有助于更好地部署自己的应用。
——参考《百度百科》
PS:类加载器负责将类的class文件加载到内存中,生成相应的Class对象。
三大类加载器
引导类加载器BootStrapClassLoader
它加载java核心API,将从sun.boot.class.path
寻找所需要的类,例如:rt.jar
PS:如果使用它加载的Class对象获取ClassLoader将会返回null。
扩展类加载器ExtClassLoader
它加载扩展的JavaClass,将从java.ext.dirs
寻找所需要的类,例如:ext\*.jar
应用类加载器AppClassLoader
它加载应用程序自身的类,将从java.class.path
寻找所需要的类
获得加载自己的类加载器
可以使用类.class.getClassLoader()
加载,也可以使用类的对象.getClass().getClassLoader()
加载。
类加载器的加载机制
全盘负责
类A如果要使用类B(内存中不存在),类A的类加载器C必须负责加载类B。
委托机制
类A的加载器如果要加载资源B,必须询问父类的类加载器是否加载过。
如果加载,将直接使用。
如果没有加载,则加载。
PS:采用全盘负责、委托机制保证一个class文件只会被加载一次,形成一个Class对象。
案例
package com.pc.classloader;import org.junit.Test;import sun.net.spi.nameservice.dns.DNSNameService;/** * 类加载器:将class文件加载到内存生成对应的Class对象 * * 问题:如何保证同一个class文件不被重复加载呢? * * 全盘委托机制 * 1.应用类加载器获得TestClassLoader.class,并没有将它加载到内存,而是委托扩展类加载器; * 2.扩展类加载器获得TestClassLoader.class,它也没有加载,委托给引导类加载器; * 3.引导类加载器获得TestClassLoader.class,它会加载自己负责的文件到内存并生成Class对象,将其它下发给扩展类加载器; * 4.扩展类加载器获得TestClassLoader.class,它会加载自己负责的文件到内存并生成Class对象,将其它下发给应用类加载器; * 5.应用类加载器获得TestClassLoader.class,加载剩余的class文件到内存并生成对应的Class对象。 * * * @author Switch * @date 2016年10月26日 * @version V1.0 */public class TestClassLoader { @Test public void test(){ //1.应用类加载器(AppClassLoader) ClassLoader classLoader = TestClassLoader.class.getClassLoader(); System.out.println(classLoader); //2.扩展类加载器(ExtClassLoader) ClassLoader classLoader2 = DNSNameService.class.getClassLoader(); System.out.println(classLoader2); //3.引导类加载器(null,获取不到,其加载为C、C++代码) ClassLoader classLoader3 = String.class.getClassLoader(); System.out.println(classLoader3); }}
- Classloader类加载器
- 类加载器ClassLoader
- ClassLoader类加载器
- ClassLoader 类加载器
- classLoader 类加载器
- ClassLoader(类加载器)
- 类加载器(ClassLoader)
- ClassLoader类加载器
- 类加载器Classloader
- 类加载器ClassLoader
- ClassLoader类加载器
- 类加载器ClassLoader
- 类加载器ClassLoader
- 类加载器ClassLoader
- 类加载器(classLoader)
- 类加载器ClassLoader
- 类加载器ClassLoader
- ClassLoader类加载器
- Java基础之多态的详细解释
- HTTP核心模块配置静态web服务器 5-MIME类型的设置
- 5 Binary String Matching
- VMware低版运行高版+破解root口令+静态IP配置
- 182.Delete Digits-删除数字(中等题)
- 类加载器ClassLoader
- 网络基础---WEB篇
- linux 安装memcached
- 在文本下写一个web应用(功能是向网页中传一个输出)
- 第五周项目1-建立链栈算法库
- zigbee协议栈学习(0)
- 冒泡
- 工作这4年
- Web架构设计概览学习--笔记