目录

1.为什么要研究java类装在机制?

2.了解类装载机制,对于我们在项目开发中有什么作用?

3.装载实现细节。

4.总结

一、为什么药研究Java类装载机制

  java类加载机制,便于我们使用自定义类加载器;深入理解,对于理解编译原理也有很大帮助。

二、了解类装载机制,在我们项目开始中的应用

  在项目中,我们可以使用自定义类加载器,可以帮助我们做如下操作:

  (1)加密。java代码很容易被反编译,如果你需要把自己的代码进行加密,可以先将编译后的代码用某种加密算法加密,然后实现自己的类加载器,负责将这段加密后的代码还原,以被操作系统所识别。这样,别人看到的是加密后的.class文件,无法进行反编译。

  (2)从指定来源加载。如果字节码文件不是采用标准的方式来加载代码,可能从数据库或者网络上加载,就需要自定义类加载器,从指定路径加载类文件。

  (3)性能。基于实际情况,动态创建代码并执行。

三、java类装载机制原理

  Java程序被执行的流程图如下:Java源文件(*.java)==》java编译器==》字节码文件(*.class)==》类装载器==》字节码校验器==》解释器==》操作系统,整个文件被load到内存区,一系列动作之后,最终形成了操作系统可以识别的代码,操作系统找到main方法开始执行。其中,heap(new出来的东西放在里面)、stack(局部变量)、data segment(静态变量或字符串常量)、code segment(存放代码)。


如上图所示,public static void main(String args[])被编译到操作系统中后,作为程序的入口,开始执行。接下来分析一下这个过程

   

如左图所示,JRE提供的jar包,正如名字一样,它提供了java运行时环境。右图是Hello World被编译为.class文件后的效果。一个java类被加载的过程如下:

1、使用命令执行javac Main.java,生成Main.class文件;执行java Main命令,JVM会将Main.class加载到内存中,并形成一个class的对象Main.class。关于Class对象和Object对象的区别,参考附录一。

2、JVM将Main.class加载到内存如下:首先,寻找JRE目录,找到jvm.dll,并初始化JVM;然后产生一个Bootstrap Loader(启动类加载器),Bootstrap Loader自动加载Extended Loader(标准扩展类加载器),并将其父loader设置为Bootstrap loader;Bootstrap Loader自动加载Appclass loader(系统类加载器),并将其父loader设为Extended Loader。最后由Appclass loader加载Main类。

即:Bootstrap loader==》Extended Loader==》Appclass loader(*.class文件说明见附录二)

3、接着第二部,在装载过程中,如编译原理中所描述,要依次进行如下步骤。类加载器appclass loader寻找类的字节码文件Main.class,并且构造出类的JVM内部表示的对象组件。

  (1)装载,查找和导入class文件。

  (2)链接,把二进制数据合并到JRE中。

    (a)校验:检查载入class文件数据的正确性

    (b)准备:给类的静态变量分配存储空间

    (c)解析:将符号引用转成直接引用

  (3)初始化,对类的静态变量,静态代码块进行初始化操作。

4、常用方法:

ClassLoader loader = Main.class.getClassLoader();
loader.loadClass("Main"); 类加载有三种方式:
1、命令行启动应用时候由JVM初始化加载
2、通过Class.forName()方法动态加载
3、通过ClassLoader.loadClass()方法动态加载

四、总结

  类的加载,最终从硬盘加载到内存当中,变成基于操作系统可以识别的二进制文件流来执行,因此,优化代码,需要掌握JVM在内存当中的布局。

附录一:Object和Class两个类之间的区别

  Object是所有类的父类,所有类当然也包括Class类。所以,Object类是Class类的父类。

private Class(ClassLoader loader) {
// Initialize final field for classLoader. The initialization value of non-null
// prevents future JIT optimizations from assuming this final field is null.
classLoader = loader;
}

  Class这个类,构造方法是私有的。所以不能显示的new 一个class对象。它是用来描述一个对象的元信息的。

附录二:*.class文件说明

  Java的Class文件是有8个字节为基础的字节流构成的,这些字节流之间都严格按照规定的顺序排列,并且字节之间不存在任何空隙,对于超过8个字节的数据,将按照Big-Endian的顺序存储的,也就是说高位字节存储在低的地址上面,而低位字节存储到高地址上面,其实这也是class文件要跨平台的关键。

深入研究Java类装载机制的更多相关文章

  1. 深入研究Java类载入机制

    深入研究Java类载入机制   类载入是Java程序运行的第一步,研究类的载入有助于了解JVM运行过程,并指导开发人员採取更有效的措施配合程序运行. 研究类载入机制的第二个目的是让程序能动态的控制类载 ...

  2. Java 类反射机制分析

    Java 类反射机制分析 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某 ...

  3. 【转】JVM类装载机制的解析,热更新的探讨

    引言 如有错误,请批评指正. Java是一种动态连接的语言.所谓动态连接,大概可以这么解释. 首先,Java可以大概想象成是编译解释执行的.对于一个*.java的文件,通过javac将会编译成一个*. ...

  4. 【转】JVM类装载机制的解析,热更新的探讨(二)

    同样,一个Class对象必须知道自己的超类.超级接口.因此,Class对象会引用自己的超类和超级接口的Class对象.这种引用一定是实例引用.(实际上,超类.超级接口的引用也存储在常量池中,但为了区分 ...

  5. Java虚拟机类装载的原理及实现(转)

    Java虚拟机类装载的原理及实现(转) 一.引言 Java虚拟机(JVM)的类装载就是指将包含在类文件中的字节码装载到JVM中, 并使其成为JVM一部分的过程.JVM的类动态装载技术能够在运行时刻动态 ...

  6. 解析Java类和对象的初始化过程

    类的初始化和对象初始化是 JVM 管理的类型生命周期中非常重要的两个环节,Google 了一遍网络,有关类装载机制的文章倒是不少,然而类初始化和对象初始化的文章并不多,特别是从字节码和 JVM 层次来 ...

  7. [转载]解析 Java 类和对象的初始化过程

    原文地址:http://www.ibm.com/developerworks/cn/java/j-lo-clobj-init/index.html 由一个单态模式引出的问题谈起 类的初始化和对象初始化 ...

  8. ClassLoader Java中类加载出现在哪个阶段,编译期和运行期? 类加载和类装载是一样的吗

    1.ClassLoader Java中类加载出现在哪个阶段,编译期和运行期? 类加载和类装载是一样的吗? :当然是运行期间啊,我自己有个理解误区,改正后如下:编译期间编译器是不去加载类的,只负责编译而 ...

  9. 深入研究java.lang.ThreadLocal类 (转)

    深入研究java.lang.ThreadLocal类     一.概述   ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是thr ...

随机推荐

  1. Thread.Sleep引发ThreadAbortException异常

    短信平台记录日志模块,是通过异步方式来记录的,即日志工具类里初始化一个Queue对象,公共的写日志方法的处理逻辑是把日志消息放到Queue里.构造器里设定一个死循环,不停的读队,然后把日志消息持久化到 ...

  2. js实用篇之String对象

    概述 String对象是JavaScript原生提供的三个包装对象之一,用来生成字符串的包装对象. var s1 = 'abc'; var s2 = new String('abc'); typeof ...

  3. js事件(event)的运行原理

    昨天写click事件时候突然脑袋抽筋想了想浏览器是怎么执行click事件的,为什么我们可以用e或者window.event这个对象获取一些事件的属性呐?以下是我的理解.如果您有更好的理解,欢迎评论!! ...

  4. 人之初,性本动 - G2 2.1 发布

    前言 随着可视化进入深水区,G2面临了越来越多交互上的需求.动画是提升交互必不可少的一部分,也是之前G2的薄弱环节.这个版本里我们开发并替换了动画底层,统一了时间轴,使G2的动画性能大大提升,并提供了 ...

  5. MyBatis-Exception:org.apache.ibatis.exceptions.PersistenceException

    错误信息如下: HTTP Status 500 - org.mybatis.spring.MyBatisSystemException: nested exception is org.apache. ...

  6. Entity Framework Core 1.1 Preview 1 简介

    实体框架核心(EF Core)是Entity Framework的一个轻量级,可扩展和跨平台版本. 10月25日,Entity Framework Core 1.1 Preview 1发布了. 升级到 ...

  7. MongoDB 聚合操作

    在MongoDB中,有两种方式计算聚合:Pipeline 和 MapReduce.Pipeline查询速度快于MapReduce,但是MapReduce的强大之处在于能够在多台Server上并行执行复 ...

  8. Java 8新特性-3 Lambda 表达式

    在 Java 8 之前,匿名内部类,监听器和事件处理器的使用都显得很冗长,代码可读性很差. 在Java 8 之前使用匿名内部类: 例如 interface ITestPrint{ public voi ...

  9. 【记录】从客户端()中检测到有潜在危险的 Request.Path 值。

    从客户端()中检测到有潜在危险的 Request.Path 值. 错误信息: Application_Error Url: www.cnblogs.com/%E5%BA%.... UserAgent: ...

  10. geotrellis使用(十九)spray-json框架介绍

    Geotrellis系列文章链接地址http://www.cnblogs.com/shoufengwei/p/5619419.html 目录 前言 spray-json简介 spray-json使用 ...