在java中类装载器把一个类装入JVM,经过以下步骤:
2012-10-25 16:05
204 查看
可以看出Test是由AppClassLoader加载器加载的
AppClassLoader的Parent 加载器是 ExtClassLoader
但是ExtClassLoader的Parent为 null 是怎么回事呵,
朋友们留意的话,前面有提到Bootstrap Loader是用C++语言写的,
依java的观点来看,逻辑上并不存在Bootstrap Loader的类实体,
所以在java程序代码里试图打印出其内容时,我们就会看到输出为null
类装载器ClassLoader(一个抽象类)描述一下JVM加载class文件的原理机制
类装载器就是寻找类或接口字节码文件进行解析并构造JVM内部对象表示的组件,
在java中类装载器把一个类装入JVM,经过以下步骤:
1、装载:查找和导入Class文件
2、链接:其中解析步骤是可以选择的
(a)检查:检查载入的class文件数据的正确性 (b)准备:给类的静态变量分配存储空间 (c)解析:将符号引用转成直接引用
3、初始化:对静态变量,静态代码块执行初始化工作
类装载工作由ClassLoder和其子类负责。JVM在运行时会产生三个ClassLoader:根装载器,ExtClassLoader(扩展类装载器)和AppClassLoader,
其中根装载器不是ClassLoader的子类,由C++编写,因此在java中看不到他,负责装载JRE的核心类库,如JRE目录下的rt.jar,charsets.jar等。
ExtClassLoader是ClassLoder的子类,负责装载JRE扩展目录ext下的jar类包;
AppClassLoader负责装载classpath路径下的类包,这三个类装载器存在父子层级关系,即根装载器是ExtClassLoader的父装载器,
ExtClassLoader是AppClassLoader的父装载器。
默认情况下使用AppClassLoader装载应用程序的类
Java装载类使用“全盘负责委托机制”。“全盘负责”是指当一个ClassLoder装载一个类时,除非显示的使用另外一个ClassLoder,
该类所依赖及引用的类也由这个ClassLoder载入;
“委托机制”是指先委托父类装载器寻找目标类,只有在找不到的情况下才从自己的类路径中查找并装载目标类。
这一点是从安全方面考虑的,试想如果一个人写了一个恶意的基础类(如java.lang.String)并加载到JVM将会引起严重的后果,
但有了全盘负责制,java.lang.String永远是由根装载器来装载,避免以上情况发生
除了JVM默认的三个ClassLoder以外,第三方可以编写自己的类装载器,以实现一些特殊的需求。
类文件被装载解析后,在JVM中都有一个对应的java.lang.Class对象,提供了类结构信息的描述。
数组,枚举及基本数据类型,甚至void都拥有对应的Class对象。
Class类没有public的构造方法,Class对象是在装载类时由JVM通过调用类装载器中的defineClass()方法自动构造的
AppClassLoader的Parent 加载器是 ExtClassLoader
但是ExtClassLoader的Parent为 null 是怎么回事呵,
朋友们留意的话,前面有提到Bootstrap Loader是用C++语言写的,
依java的观点来看,逻辑上并不存在Bootstrap Loader的类实体,
所以在java程序代码里试图打印出其内容时,我们就会看到输出为null
类装载器ClassLoader(一个抽象类)描述一下JVM加载class文件的原理机制
类装载器就是寻找类或接口字节码文件进行解析并构造JVM内部对象表示的组件,
在java中类装载器把一个类装入JVM,经过以下步骤:
1、装载:查找和导入Class文件
2、链接:其中解析步骤是可以选择的
(a)检查:检查载入的class文件数据的正确性 (b)准备:给类的静态变量分配存储空间 (c)解析:将符号引用转成直接引用
3、初始化:对静态变量,静态代码块执行初始化工作
类装载工作由ClassLoder和其子类负责。JVM在运行时会产生三个ClassLoader:根装载器,ExtClassLoader(扩展类装载器)和AppClassLoader,
其中根装载器不是ClassLoader的子类,由C++编写,因此在java中看不到他,负责装载JRE的核心类库,如JRE目录下的rt.jar,charsets.jar等。
ExtClassLoader是ClassLoder的子类,负责装载JRE扩展目录ext下的jar类包;
AppClassLoader负责装载classpath路径下的类包,这三个类装载器存在父子层级关系,即根装载器是ExtClassLoader的父装载器,
ExtClassLoader是AppClassLoader的父装载器。
默认情况下使用AppClassLoader装载应用程序的类
Java装载类使用“全盘负责委托机制”。“全盘负责”是指当一个ClassLoder装载一个类时,除非显示的使用另外一个ClassLoder,
该类所依赖及引用的类也由这个ClassLoder载入;
“委托机制”是指先委托父类装载器寻找目标类,只有在找不到的情况下才从自己的类路径中查找并装载目标类。
这一点是从安全方面考虑的,试想如果一个人写了一个恶意的基础类(如java.lang.String)并加载到JVM将会引起严重的后果,
但有了全盘负责制,java.lang.String永远是由根装载器来装载,避免以上情况发生
除了JVM默认的三个ClassLoder以外,第三方可以编写自己的类装载器,以实现一些特殊的需求。
类文件被装载解析后,在JVM中都有一个对应的java.lang.Class对象,提供了类结构信息的描述。
数组,枚举及基本数据类型,甚至void都拥有对应的Class对象。
Class类没有public的构造方法,Class对象是在装载类时由JVM通过调用类装载器中的defineClass()方法自动构造的
相关文章推荐
- 做一个java项目要经过那些正规的步骤
- 一个JVM的错误让我遇到了:A fatal error has been detected by the Java Runtime Environment
- 一个企业的诞生首先经过几个步骤
- java实现从一个数据库查询数据经过处理导入另外一个数据库中
- JVM如何判断一个Java对象是否可以回收
- java 剑指offer 第二题:请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
- java之jvm学习笔记二(类装载器的体系结构)
- 快速入手一个JavaWeb项目的基本步骤
- JAVA:创建一个与jvm有同样生命周期的对象
- 在Java中建立一个简单的客户端涉及4个步骤
- java 剑指offer 第二题:请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
- 写一个简单的java web页面必须的步骤
- JVM如何判断一个Java对象是否可以回收
- JVM源码分析之一个Java进程究竟能创建多少线程
- Java字节码4-使用Java-Agent实现一个JVM监控工具
- W3C规范的正式出台需要经过以下七个步骤
- java之jvm学习笔记二(类装载器的体系结构)
- java之jvm学习笔记二(类装载器的体系结构)
- 深入JVM(2): 由一个栈溢出的问题看Java类和对象的初始化
- 用java实现验证码的生成,以下代码是一个controller,可以直接使用!