ClassLoader工作机制介绍(整理版)
2015-11-24 19:12
375 查看
1、ClassLoader类结构
我们经常扩展ClassLoader以及它的重载方法:其主要方法有defineClass、findClass、loadClass、resolveClass。其中defineClass方法用来将byte字节流解析成JVM能够识别的Class对象。findClass方法和defineClass一起使用,通过覆盖ClassLoader父类的findClass方法来实现类的加载规则,从而取得加载类的字节码,然后调用defineClass方法生成类的Class对象。ClassLoader是个抽象类,它还有很多子类,我们可以实现自己的ClassLoader,一般要继承URLClassLoader这个子类,调用其相关方法。
2、ClasLoader加载机制
整个JVM平台提供三层ClassLoader
1)、Bootstrap ClasLoader(搜索路径 -Xbootclasspath/a:),它主要加载自身工作需要的类,仅仅是一个加载工具,没有更高一级的父加载器,也没有子加载器。
2)、ExtClassLoader(搜索路径 -Djava.ext.dirs),继承URLClassLoader,并遵守ClassLoader的加载规则。
3)、AppClassLoader(搜索路径 -Djava.class.path= -cp 或 -classpath),其父类是ExtClassLoader,通常在classpath目录下加载。
JVM加载class文件到内存中有两种方式:隐式加载、显示加载。所谓隐式加载不通过代码调用继承ClassLoader,自动加载到内存中,显示加载需要调用继承ClassLoader类,例如:this.getclass.getClassLoader().loader()。
3、加载class文件
step 1、找到.class文件并把这个文件包含的字节码加载到内存中。
step 2、包括三个步骤,分别是字节码验证、Class类数据结构分析及相应的内存分配和最后的符号表的链接。
step 3、类中静态属性和初始化赋值,以及静态快的执行等。
4、常见加载错误分析(介绍两例)
1)、ClassNotFoundException异常是java初学者经常遇到的,异常原因是加载不到类,就是JVM要加载指定文件的字节码到内存时,并没有找到这个文件对应的字节码,也就是这个文件并不存在。解决办法就是检查当前的classpath目录下有没有制定的文件存在。如果不知道当前的classpath路径,就可以通过如下命令来获取:
this.getClass().getClassLoader().getResource("").toString()
2)、NoClassDefFoundError,这个异常在第一次使用命令执行java类时很可能碰到,如下java -cp example.jar Example。在这个jar包里面只有一个类,这个类是com.cn.Example,正确的写法是这样的:java -cp example.jar com.cn.Example。
我们经常扩展ClassLoader以及它的重载方法:其主要方法有defineClass、findClass、loadClass、resolveClass。其中defineClass方法用来将byte字节流解析成JVM能够识别的Class对象。findClass方法和defineClass一起使用,通过覆盖ClassLoader父类的findClass方法来实现类的加载规则,从而取得加载类的字节码,然后调用defineClass方法生成类的Class对象。ClassLoader是个抽象类,它还有很多子类,我们可以实现自己的ClassLoader,一般要继承URLClassLoader这个子类,调用其相关方法。
2、ClasLoader加载机制
整个JVM平台提供三层ClassLoader
1)、Bootstrap ClasLoader(搜索路径 -Xbootclasspath/a:),它主要加载自身工作需要的类,仅仅是一个加载工具,没有更高一级的父加载器,也没有子加载器。
2)、ExtClassLoader(搜索路径 -Djava.ext.dirs),继承URLClassLoader,并遵守ClassLoader的加载规则。
3)、AppClassLoader(搜索路径 -Djava.class.path= -cp 或 -classpath),其父类是ExtClassLoader,通常在classpath目录下加载。
JVM加载class文件到内存中有两种方式:隐式加载、显示加载。所谓隐式加载不通过代码调用继承ClassLoader,自动加载到内存中,显示加载需要调用继承ClassLoader类,例如:this.getclass.getClassLoader().loader()。
3、加载class文件
step 1、找到.class文件并把这个文件包含的字节码加载到内存中。
step 2、包括三个步骤,分别是字节码验证、Class类数据结构分析及相应的内存分配和最后的符号表的链接。
step 3、类中静态属性和初始化赋值,以及静态快的执行等。
4、常见加载错误分析(介绍两例)
1)、ClassNotFoundException异常是java初学者经常遇到的,异常原因是加载不到类,就是JVM要加载指定文件的字节码到内存时,并没有找到这个文件对应的字节码,也就是这个文件并不存在。解决办法就是检查当前的classpath目录下有没有制定的文件存在。如果不知道当前的classpath路径,就可以通过如下命令来获取:
this.getClass().getClassLoader().getResource("").toString()
2)、NoClassDefFoundError,这个异常在第一次使用命令执行java类时很可能碰到,如下java -cp example.jar Example。在这个jar包里面只有一个类,这个类是com.cn.Example,正确的写法是这样的:java -cp example.jar com.cn.Example。
相关文章推荐
- Deep learning论文笔记一:ImageNet Classification with Deep Convolutional Neural Networks
- 简洁代码之道(1):用多态替代条件语句
- jquery 首页轮播插件 icarouselbox.js
- DZNEmptyDataSet customViewForEmptyDataSet: 1.7.1版本 点击事件无法响应
- Wireshark实战分析之IP协议(四)
- Reg注册表的一些使用方法
- BIOS在内存中加载中断向量表和中断服务程序
- C 位运算符
- C++ socket编程
- 南大软院大神养成计划--js
- Deep learning:四十一(Dropout简单理解)
- PS
- iphone开发基础:loadView/viewDidLoad/initWithNibName/awakeFromNib/initWithCoder的用法
- label.lineBreakMode设置lable中文字过长时的显示格式,其中可以有末尾以省略号显示。
- 为tomcat 创建定时 任务 关闭 重启
- HDU 3555 Bomb
- 核心java系列——异常处理
- xmppframework在openfire下总是密码验证不通过
- linux socket
- hibernate对象的几种状态