众所周知,java是编译型的语言,写的是java文件,最后运行的是class文件,class文件是运行在JVM之中的,这时候就有一个问题,JVM如何装载class文件的?是通过ClassLoader来进行的,这里做一下笔记,因为发现原作者写的很好《深入分析java web 技术内幕》。

ClassLoader的结构分析

ClassLoader是一个抽象类,他有很多子类,JVM默认有几个实现类,当然我们也可以自己继承ClassLoader。

1、defineClass:将byte字节转换为JVM能够识别的Class对象,这样就意味着可以是class文件也可是是网络上的字节流了;

2、defineClass通常和findClass一起使用,findClass的作用是取得要加载的类的字节码;

3、如果想在类被加载到JVM的时候就被链接,可以调用resolveClass来完成;

4、如果不想自定义加载类的规则,也没有复杂的逻辑,可以通过this.getClass().getClassLoader().loadClass("") 来进行加载;

ClassLoader中的几个实现类

1、Bootstrap ClassLoader 这个是JVM加载自身工作需要的类,完全由JVM自己来控制,外部无法访问到这个;

2、ExtClassLoader比较特殊的,服务的特定目标在System.getProperty("java.ext.dirs");

3、AppClassLoader,父类是ExtClassLoader,"java.class.path"中的类都可以被这个类加载器加载;

4、URLClassLoader,一般这个类帮我们实现了大部分的工作,自定义可以继承这个类,这样仅仅在需要的地方做修改就行了;

JVM加载class文件到内存的方式

1、显示加载:不通过代码里的ClassLoader调用,而是JVM来自动加载类到内存中的方式;

1.1、通过Class中的forName;

1.2、通过ClassLoader中的loadClass

1.3、通过ClasLoader中的findSystemClass

2、隐身加载:通过代码中ClassLoader来加载的方式;

如何加载class文件

1、找到.class文件,并把文件中包含的byte加载到内存中

2、验证和解析

2.1、字节码验证,确保格式正确和行为正确

2.2、类准备,类中定义的字段、方法和实现接口锁必须的数据结构

2.3、解析,装入类所引用的其他所有类,如父类、字段、方法签名、方法中使用的本地变量等

3、静态属性和初始化赋值,以及静态块的执行等

关于类加载过程中的几种常见异常

1、ClassNotFoundException

JVM要加载指定的文件的字节码到内存中,但是并没有发现这个文件的字节码。检查方法就是在classpath中看看是否有指定文件存在。

2、NoClassDefFoundError

JVM规范中这个异常出现的情况是使用new 关键字、属性引用类、实现接口、继承类,如果不存在,会报这个异常。

3、ClassCastException

对于普通对象,对象必须是目标类的实例或者目标类的子类的实例,如果目标类是接口,那么会把他当做实现了该接口的一个子类。

有哪些需要自定义ClassLoader的情况?

1、在自定义的路径下查找自定义的classs文件,需要的文件并不是classpath下面的;

2、对于加载的类做特殊的处理,例如网络传输的安全性等;

3、可以定义类的失效机制,例如检查到文件被修改,则重新加载,从而实现类的热部署;

http://iamzhongyong.iteye.com/blog/2091549

关于JVM的ClassLoader(转)的更多相关文章

  1. JVM的ClassLoader过程分析

    本文来自网络:深入分析Java ClassLoader原理 http://my.oschina.net/zhengjian/blog/133836 一. JVM的ClassLoader过程以及装载原理 ...

  2. java虚拟机学习-慢慢琢磨JVM(2-1)ClassLoader的工作机制

    ClassLoader的工作机制 java应用环境中不同的class分别由不同的ClassLoader负责加载. 一个jvm中默认的classloader有Bootstrap ClassLoader. ...

  3. JVM思考-ClassLoader.loadClasshe和Class.forName区别

    JVM思考-ClassLoader.loadClasshe和Class.forName区别 目录:JVM总括:目录 见博客第四节:JVM总括四-类加载过程.双亲委派模型.对象实例化过程

  4. JVM和ClassLoader

    JVM和ClassLoader 2019-11-08 目录 1 JVM架构整体架构 1.1 类加载器子系统 1.1.1 加载 1.1.2 链接 1.1.3 初始化 1.2 运行时数据区(Runtime ...

  5. JVM的classloader(转)

    Java中一共有四个类加载器,之所以叫类加载器,是程序要用到某个类的时候,要用类加载器载入内存.    这四个类加载器分别为:Bootstrap ClassLoader.Extension Class ...

  6. JVM 系列 ClassLoader

    JVM 系列()ClassLoader 在前面一节中,主要介绍了 Class 的装载过程,Class 的装载大体上可以分为加载类.连接类和初始化 3 个阶段.本小节将主要介绍绍 Java 语言中的 C ...

  7. JVM中ClassLoader的学习

    JVM中class loaderの学习 一..class文件和jvm的关系 类的加载 所有的编译生成的.class文件都会被直接加载到JVM里面来吗(并不 首先我们明确一个概念,.class文件加载到 ...

  8. jvm学习-ClassLoader(二)

    ClassLoader结构 jdk加载的4个步骤 CustomClassLoader 用户自定义的classLoader APPClassLoader主要加载classPath下面的class Ext ...

  9. JVM(三)JVM的ClassLoader类加载器

    1.类加载的生命周期 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括: (1)加载 (2)验证 (3)准备 (4)解析 (5)初始化 (6)使用 (7)卸载 一共7个阶段.其中验 ...

随机推荐

  1. 重操JS旧业第二弹:数据类型与类型转换

    一 数据类型 1 js中的数据类型 1.1 数据类型列举 1)number类型 2)boolean类型 3)string类型 4)对象类型 5)函数类型 6)undefined类型 1.2 数据类型获 ...

  2. 一个问题:关于类型转换Type Cast(汇编讲解 as 语法)

    问题如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34   ...

  3. 1.1.5-学习Opencv与MFC混合编程之---画图工具 输入文字和填充图像 修改光标

    源代码:http://download.csdn.net/detail/nuptboyzhb/3961696 输入文字 l 对话框 1.    插入,资源,选择对话框资源 2.    编辑对话框如下: ...

  4. 学习了LINUX下用C语言遍历文件夹,一些心得

    struct dirent中的几个成员: d_type:4表示为目录,8表示为文件 d_reclen:16表示子目录或文件,24表示非子目录 d_name:目录或文件的名称 具体代码如下,仅供参考 # ...

  5. grails一对一关联关系

    一对一关联关系开发中用的没有一对多那么广泛.可是我认为掌握以下还是有必要的.一对一关联关系有一张表存在外键,引用的通常是主表的主键.grails也对一对一关联关系提供了非常好的支持.配置也是简单的不得 ...

  6. twitter分享问题(四)—— Unknown error(api v1过度到V1.1产生)

    unknow error! 今天为了使用GA(谷歌分析)追踪twitter分享,又测试了一下twitter分享功能,发现又出问题(使用sharekit分享).就是“unknow error”,之前也碰 ...

  7. 【Demo 0008】Java基础-抽象类

    本掌学习要点:       1.  了解抽象类的定义及使用场景:       2.  掌握final修饰的类.方法以及变量作用及用法:       3.  掌握abstract 修饰的类及方法作用及用 ...

  8. Ppoj 1014 深搜

    这个题题意是给你价值1-6的珠宝个数输出能否平分为两份(如果平分为三分就不知道怎么做了……) 主要是用回溯DFS,但是要剪枝,对200取模……!!(很重要……) 代码…… #include <i ...

  9. 被忽视的TWaver功能(1)

    应客户需求写个Demo,Demo中包括一些经常使用的功能.包括解析JSON数据生成TWaver中的网元和连线.网元右下角带上不同标识的小图标,连线须要是二次曲线.弹出菜单和信息板.跟大家分享下.先上图 ...

  10. OSGi 学习之路(4) - osgi的模块化 java在模块化的局限性

    底层代码可见性控制 Java提供了private,public,protected和package private(无修饰符)这四种访问控制级别,不过这仅仅提供了底层的OO数据封装特性.包这个概念确实 ...