J2SE(五)Java之类的加载机制
2016-04-18 10:20
489 查看
为什么要研究java类的加载机制:
(1)有助于了解JVM执行过程,并指导开发者采取更有效的措施配合程序执行。
(2)让程序能动态的控制类加载,比如热部署等,提高程序的灵活性和适应性。
什么是java类的加载机制:
Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数,属性和方法等,Java允许用户借由这个Class相关的元信息对象间接调用Class对象的功能。虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。
java类加载过程:
Java程序运行在内存中,当执行java className命令时,JVM会将className.class加载到内存中,并形成一个Class的对象className.class。
其过程如下:
(1)寻找jre目录,寻找jvm.dll,并初始化JVM;
(2)产生一个Bootstrap Loader(启动类加载器);
(3)Bootstrap Loader自动加载Extended Loader(标准扩展类加载器),并将其父Loader设为Bootstrap Loader。
(4)Bootstrap Loader自动加载AppClass Loader(系统类加载器),并将其父Loader设为Extended Loader。
(5)最后由AppClass Loader加载HelloWorld类。
上面就是java类加载的基本过程,其流程图如下:
类加载器搜索目录查看:
for (Map.Entry<Object, Object> entry : System.getProperties().entrySet()) {
System.out.println(entry.getKey() + "\t" + entry.getValue());
}类加载器类别:
Bootstrap Loader(启动类加载器):
加载java基础类,主要是 %JRE_HOME/lib/ 目录下的rt.jar、resources.jar、charsets.jar和class等。
Extended Loader(标准扩展类加载器ExtClassLoader):
负责加载java扩展类,主要是 %JRE_HOME/lib/ext 目录下的jar和class
AppClass Loader(系统类加载器AppClassLoader):
负责加载当前java应用的classpath中的所有类HelloWorld
类加载器特点:
1、运行一个程序时,总是由AppClass Loader(系统类加载器)开始加载指定的类。
2、在加载类时,每个类加载器会将加载任务上交给其父,如果其父找不到,再由自己去加载(双亲委派机制)。
3、Bootstrap Loader(启动类加载器)是最顶级的类加载器了,其父加载器为null.
JVM在加载类时默认采用的是双亲委派机制。通俗的讲,就是某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载 。
类的加载方式:
类加载有三种方式:
1、命令行启动应用时候由JVM初始化加载
2、通过Class.forName()方法动态加载
3、通过ClassLoader.loadClass()方法动态加载
(1)有助于了解JVM执行过程,并指导开发者采取更有效的措施配合程序执行。
(2)让程序能动态的控制类加载,比如热部署等,提高程序的灵活性和适应性。
什么是java类的加载机制:
Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数,属性和方法等,Java允许用户借由这个Class相关的元信息对象间接调用Class对象的功能。虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。
java类加载过程:
Java程序运行在内存中,当执行java className命令时,JVM会将className.class加载到内存中,并形成一个Class的对象className.class。
其过程如下:
(1)寻找jre目录,寻找jvm.dll,并初始化JVM;
(2)产生一个Bootstrap Loader(启动类加载器);
(3)Bootstrap Loader自动加载Extended Loader(标准扩展类加载器),并将其父Loader设为Bootstrap Loader。
(4)Bootstrap Loader自动加载AppClass Loader(系统类加载器),并将其父Loader设为Extended Loader。
(5)最后由AppClass Loader加载HelloWorld类。
上面就是java类加载的基本过程,其流程图如下:
类加载器搜索目录查看:
for (Map.Entry<Object, Object> entry : System.getProperties().entrySet()) {
System.out.println(entry.getKey() + "\t" + entry.getValue());
}类加载器类别:
Bootstrap Loader(启动类加载器):
加载java基础类,主要是 %JRE_HOME/lib/ 目录下的rt.jar、resources.jar、charsets.jar和class等。
Extended Loader(标准扩展类加载器ExtClassLoader):
负责加载java扩展类,主要是 %JRE_HOME/lib/ext 目录下的jar和class
AppClass Loader(系统类加载器AppClassLoader):
负责加载当前java应用的classpath中的所有类HelloWorld
类加载器特点:
1、运行一个程序时,总是由AppClass Loader(系统类加载器)开始加载指定的类。
2、在加载类时,每个类加载器会将加载任务上交给其父,如果其父找不到,再由自己去加载(双亲委派机制)。
3、Bootstrap Loader(启动类加载器)是最顶级的类加载器了,其父加载器为null.
JVM在加载类时默认采用的是双亲委派机制。通俗的讲,就是某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载 。
类的加载方式:
类加载有三种方式:
1、命令行启动应用时候由JVM初始化加载
2、通过Class.forName()方法动态加载
3、通过ClassLoader.loadClass()方法动态加载
相关文章推荐
- J2SE与c#的几点比较
- JDK、J2EE、J2SE、J2ME四个易混淆概念区分
- jdk,j2ee,j2se,j2me的概念区别
- 一道小面试题:不借助中间变量实现连个整数交换
- @SuppressWarnings注解
- Linux下启动、停止J2SE程序(脚本)
- 【Java基础】抽象类和接口的区别
- 【Java基础】多态性
- 【Java基础】重写与重载
- [存档]J2ME中随机数字处理全攻略
- 为 SWT Windows桌面程序定制适合分发的 JRE
- Java日记(1) 一. 认识Java
- 08月28日学习杂记(复习:ANT,集合及零散知识点)
- 转载容器类的介绍
- 转载J2SE新功能
- 入门学习钥匙
- java学习笔记(1)
- java中的时间操作
- 随便写点,非计算机专业学生
- Java Networking and Proxies