昨天是项目组双周学习交流的第二次活动,由我主持有关java虚拟机的讲解和讨论。以下是讲义的大纲:
JAVA体系结构
JAVA虚拟机体系
Java class 文件格式
Java 虚拟机类装载体系
Java 虚拟机垃圾收集机制
进一步学习资料
类装载机制是java虚拟机中一个重要的内容,也是我这次准备的讲义中要重点讲解的内容。
Java 虚拟机类装载体系
装载:
把二进制形式的java类型读入Java虚拟机中
通过该类型的完全限定名,产生一个代表该类型的二进制数据流。
解析这个二进制数据流为方法区的内部数据结构。
在堆上创建一个表示该类型的java.lang.Class类的实例。
1、何时装载
(1)隐式装载
package test;
Public class A{
public void static main(String args[]){
B b = new B();
}
}
class B{C c;}
class C{}
A、B、C类装载顺序:A 、B (C不装载)
(2)显示装载
A、使用Class类的forName方法。它可以指定装载器,也可以使用装载当前类的装载器。例如:
Class.forName("test.A");
B、使用类路径类装载装载.
ClassLoader.getSystemClassLoader().loadClass("test.A");
C、使用当前进程上下文的使用的类装载器进行装载,这种装载类的方法常常被有着复杂类装载体系结构的系统所使用。
Thread.currentThread().getContextClassLoader().loadClass(“test.A”) D、使用自定义的类装载器装载类
public class MyClassLoader extends URLClassLoader{ public MyClassLoader() { super(new URL[0]); }
}
MyClassLoader myClassLoader = new MyClassLoader(); myClassLoader.loadClass("test.A");
2、谁来装载——java虚拟机的两种类装载器
A、系统类装载器——Bootstrap(API)
Java虚拟机实现的一部分,有可能是C++编写。
B、自定义类装载器
普通的Java对象,必须派生自 java.lang.ClassLoder
例子:
标准扩展类装载器:ExtClassLoader(javax、lib/ext)
系统(类路径)类装载器:AppClassLoader(classPath)
任意继承自java.lang.ClassLoder的类
3、双亲委派模型(不是类继承关系)
4、类装载器和命名空间
默认条件下某个类只能看见用同一个类装载器装载(同一命名空间)的其它类。
用不同的类载入程序装入的类在不同的命名空间中,并且除非明确许可外都不能互相访问。
5、类装载体系和Java安全模式
把代码分离到不同的命名空间并在不同命名空间的代码间设置保护屏;
保护象JavaAPI这样已获确认的库。