1.JVM自带的加载器
(1)根类加载器(Bootstrap)
(2)扩展加载器(Extension)
(3)系统加载器(System)
2.用户自定义加载器
Java类加载器解析
一:分类
Java中的类加载器可以分为四类:
1 Bootstrp loader
Bootstrp加载器是用C++语言写的,它是在Java虚拟机启动后初始化的,它主要负责加载%JAVA_HOME%/jre/lib以及%JAVA_HOME%/jre/classes中的类。
2 ExtClassLoader
Bootstrp loader加载ExtClassLoader,并且将ExtClassLoader的父加载器设置为Bootstrp loader.ExtClassLoader主要加载%JAVA_HOME%/jre/lib/ext中的jar文档,以及此路径下的所有classes目录。
3 AppClassLoader
Bootstrp loader加载完ExtClassLoader后,就会加载AppClassLoader,并且将AppClassLoader的父加载器指定为ExtClassLoader。AppClassLoader主要负责加载classpath所指定的位置的类或者是jar文档。
4 URLClassLoader
URLClassLoader是我们可以自定义的加载器,我们可以通过指定一个URL对象来创建此加载器,它所加载路径就是URL所代表的逻辑位置。并且它的父加载器是AppClassLoader。
(*注意:某个加载器的父加载器与加载它的加载器没有联系,父加载器是按照规定的规则指定的)
二:委托模型
所谓委托模型就是指:当一个加载器在加载某个类的时候先让父加载器去加载,父加载器再让其父加载器加载,依此类推,如果所有的父加载器都不能加载,再由自己来加载,而如果此时自己也不能加载,则产生java.lang.NoClassDefFoundError错误。
委托模型最大的好处就是提高了java的安全性,比如:如果加载器的父加载器已经加载了某个类,那么自己就不能再加载此类了,这样就使得一些与java类库中同名的类不能加载进来。
三:ClassLoader以及Class
我们都知道java中的每个类(包括接口)编译后都会生成一个.class文件,当.class文件被加载器加载到内存中后,就会生成一个Class对象的实例,此实例有一个指向加载它自己的加载器的实例引用。而我们每个类的实例都会有一个指向此实例所对应的类的Class对象。并且值得我们注意的是如果一个类被不同的加载器加载,那么对于每个类加载器来说类的静态初始化块都要执行。
转载请注明出处http://chillwarmoon.iteye.com
要弄清楚动态加载(热部署),首先要明白以下几点:
(1)一个classLoader实例只能对一个类加载一次。
(2)通过defineClass方法,可以动态加载类文件的byte数组到classloader实例中
(3)ClassLoader的loadClass方法加载类的顺序是:先用bootstrap classLoader加载类,如果加载不到,则用extClassLoader加载类,最后用system classLoader加载类
(4)假设某个自定义的CustomClassLoader用defineClass加载类,并且CustomClassLoader并没有覆盖loadClass方法。CustomClassLoader加载一个实现了接口IA的类A,那么defineClass会调用父类的loadClass,加载接口IA到system ClassLoader中。然而A被加载到了CustomClassLoader的实例中。
基于以上前提,若想达到对类A的热部署,不需要覆盖loadClass方法,让system ClassLoader加载接口,所以在由system classLoader加载的类中(也就是面向开发人员的代码中)可以通过类型转换IA a=(IA)clazz.newInstance(); 来访问动态加载的A的实例。但是因为每个classLoader实例只能对类加载一次,所以每次动态加载的时候,都需要创建一个classLoader实例来加载实现。
在实际应用中还要考虑动态加载点,也就是说什么时候对那些需要热部署的类进行动态加载。在网络应用中,如果要对某个长链接进行自定义处理,那么可以在链接建立的时候动态加载类。对于短链接的话,可以通过JMX手动动态更新类。也可以通过某个定时器来动态加载。
用动态加载的观点来看远程过程调用,就是说本地保存远程的接口,该接口是由本地的system classloader加载进来的,实现类通过byte流传过来,然后用特定的classLoader实例来加载该实现类。因此实现了远程过程调用。
分享到:
相关推荐
类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一。它使得 Java 类可以被动态加载到 Java 虚拟机中并执行。类加载器从 JDK 1.0 就出现了,最初是为了满足 Java Applet 的需要而开发出来的。Java ...
看完一个Java加载原理教程后,写了这个自己的类加载器,作个笔记,以便以且使用
自定义类加载器实现自定义加载。自定义类加载器实现自定义加载
DevLoader.zip tomcat 类加载器
Java类加载器可以直接从Maven存储库加载并运行类,能在运行时解决依赖关系
当JVM(Java虚拟机)启动时,会形成由三个类加载器组成的初始类加载器层次结构,理解类加载器:J2EE 环境下的 log4j.files
简单的自定义类加载器问候世界hello word,基于磁盘的ClassLoader
类装载器学习一、类加载器的基本概念 类装载器学习一、类加载器的基本概念 类装载器学习一、类加载器的基本概念
java 类加密 使用类加载器解密加载类 反射执行main
类加载器
ClassLoader 三种类加载方式 Boostrap Extenxsion 以及Application ClassLoad分别适用的场景
JDK(Java Development Kit) 是 Java 语言的软件开发工具包(SDK)。 SE(J2SE),standard edition,标准版,是我们通常用的一个版本,从JDK 5.0开始,改名为Java SE。
java应用程序类加载器(ClassLoader for java Application),类似exe4j, 方便启动java程序, 配置灵活,支持多平台选择性配置
(父子关系一般不会以继承的关系实现,而是以组合关系来复用父加载器的代码)工作过程如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请
什么是类加载器和什么是双亲委派机制
ClassLoader的API使用和自定义
类加载器是Java最强大的特征之一。但是开发者常常忘记类加载组件。类加载器是在运行时负责寻找和加载类文件的类。Java允许使用不同的类加载器,甚至自定义的类加载器。类加载器从源文件(通常是.class 或 .jar文件)...
3-7Tomcat中自定义类加载器的使用与源码实现(1).mp4
java类加载器学习三、类加载器的委托模式