您的位置:首页 > 编程语言 > Java开发

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()方法动态加载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  J2SE