`
bearsorry
  • 浏览: 92944 次
  • 性别: Icon_minigender_2
  • 来自: 湖南
社区版块
存档分类
最新评论

Java编译和动态装载过程

    博客分类:
  • JAVA
阅读更多

      大家应该还记得我们刚开始学java的时候,都是由记事本开始写代码的吧!这篇博客就从这里开始说起。

     我们编写的代码都是纯文本的源程序,它必须经过编译,生成字节码的类文件之后才能运行。类文件是二进制的,没有统一的格式,JVM能识别这样的类文件并执行它,java的编译器是javac,这样编译之后的类文件就可以执行了,JVM再通过java解释器执类文件,这个解释执行过程又分为三部分:代码的装入、代码的校验、代码的执行,其中,代码的装入是由类装载器来完成的,代码的校验是由字节码校验器进行检查,校验完之后就进行执行。

     说到这里,先让我们来了解一下java的四大核心技术思想吧!

     1、java虚拟机:
 java虚拟机的主要任务是装载class文件并且执行里面的字节码,java虚拟机包含一个类装载器,它可以从程序和API中转载class文件,java API中只有程序需要执行的那些类才会被装载进来。
     2、java class文件:
 为java程序提供独立于底层主机平台的二进制形式的服务。

     3、类转载器的体系结构:
 一个java应用程序可以运用两种装载器:用户定义的类装载器和启动类装载器,启动类装载器(这是系统中唯一的)是java虚拟机实现的一部分。启动类装载器通常使用某种默认方式从本地磁盘中装载类,包括java API类。

     4、java API:
 java API是运行库的集合,它提供了一套访问主机系统资源的标准方法。

      有了一些基本了解之后,我们来着重研究一下类加载器。

      java虚拟机预定义的三种类型的加载器:
      1、启动类加载器(Bootstrap):负责加载<java_Runtime_Home>/lib下面的类库加载到内存中。
      2、标准扩展类加载器(Extension):该加载器类是由sun.misc.Launcher$ExtClassLoader实现的,它负责将
<Java_Runtime_Home>/lib/ext里面的类库加载到内存中。
      3、系统类加载器(System):该类加载器是由sun.misc.Launcher$AppClassLoader实现的,它负责将系统类路径(CLASSPATH)中的类库加载到内存中。
       我们可以用代码来测试一下这三个主要的类加载器:

     

package com.netjava0225;

import com.sun.crypto.provider.AESCipher;

public class TestClassLoad2 {
	
	public static void main(String[] args) {
		System.out.println(String.class.getClassLoader());
		System.out.println(AESCipher.class.getClassLoader().getClass().getName());
		System.out.println(TestClassLoad2.class.getClassLoader().getClass().getName());
		System.out.println(ClassLoader.getSystemClassLoader().getClass().getName());
	}

}

 

输出的结果是:

null
sun.misc.Launcher$ExtClassLoader
sun.misc.Launcher$AppClassLoader
sun.misc.Launcher$AppClassLoader

 

这里说明一下,因为启动类加载器是java中最核心最基本的类加载器,所以不能那么容易取得其实例化的对象,即为NULL。

 

 

这三类加载器的运行过程其实是双亲委派机制实现加载过程,它们是一层一层的向上递交:

如图所示:

 

 

 

同样我们可以来分析一下ClassLoade的源码:

抽象类ClassLoader部分代码:


 

protected Class<?> loadClass(String name, boolean resolve)
        throws ClassNotFoundException
    {
        synchronized (getClassLoadingLock(name)) {
            // 首先检查类是否被加载
            Class c = findLoadedClass(name);
            if (c == null) {
                long t0 = System.nanoTime();
                try {
		//查看父类加载器时候已经加载该类
                    if (parent != null) {
                        c = parent.loadClass(name, false);
                    } else {
		    //查看启动加载器是否加载该类
                        c = findBootstrapClassOrNull(name);
                    }
                } catch (ClassNotFoundException e) {
                    // ClassNotFoundException thrown if class not found
                    // from the non-null parent class loader
                }

                if (c == null) {
		//最后才调用自己的加载器进行加载
                    // If still not found, then invoke findClass in order
                    // to find the class.
                    long t1 = System.nanoTime();
                    c = findClass(name);

                    // this is the defining class loader; record the stats
                    sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
                    sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
                    sun.misc.PerfCounter.getFindClasses().increment();
                }
            }
            if (resolve) {
                resolveClass(c);
            }
            return c;
        }
    }

 这样就能很清晰的看到这个过程是怎样进行加载的了,还有什么是动态装载呢?!其实就是你应该程序运行一段代码是遇到一个类就要其父类进行加载,一次上去都不能加载的话,就自己进行加载!下次再讲一些关于JVM和垃圾回收机制方面的东西吧!

 

  • 大小: 3.8 KB
3
2
分享到:
评论

相关推荐

    高级语言的编译:链接及装载过程介绍1

    第一,CPU 肯定不能理解这些高级语言代码,编译器需要把代码编译成二进制指令 第二,指令流跳转的时候,CPU 怎么能找到要跳转的位置,编译器需要为每个定义的函数

    java源码包---java 源码 大量 实例

     Java绘制图片火焰效果,源代码相关注释:前景和背景Image对象、Applet和绘制火焰的效果的Image对象、Applet和绘制火焰的效果的Graphics对象、火焰效果的线程、Applet的高度,图片到图片装载器、绘制火焰效果的X坐标...

    ClassGuard java类加密

    classguard是防止java反编译工具的工具,它允许java类文件使用128bit的AES加密加密。AES密钥是随机生成的每次启动加密工具。解密是一个自定义的类装载器透明地做。这类装载器的主要部分是用C防止反编译等篡改。

    算法设计中关于优先队列式分支限界法解装载问题的代码

    分支限界法中的优先队列式分支限界法解装载问题

    java 混淆工具,不可逆 jocky

    Jocky混淆编译器是在Sun JDK中提供的Java编译器(javac)的基础上完成的,修改了其中的代码生成过程,对编译器生成的中间代码进行混淆, 最后再生成class文件,这样编译和混淆只需要一个步骤就可以完成。另外可以在源...

    JAVA上百实例源码以及开源项目

     Java绘制图片火焰效果,源代码相关注释:前景和背景Image对象、Applet和绘制火焰的效果的Image对象、Applet和绘制火焰的效果的Graphics对象、火焰效果的线程、Applet的高度,图片到图片装载器、绘制火焰效果的X坐标...

    JAVA上百实例源码以及开源项目源代码

     Java绘制图片火焰效果,源代码相关注释:前景和背景Image对象、Applet和绘制火焰的效果的Image对象、Applet和绘制火焰的效果的Graphics对象、火焰效果的线程、Applet的高度,图片到图片装载器、绘制火焰效果的X坐标...

    java源码包4

     Java绘制图片火焰效果,源代码相关注释:前景和背景Image对象、Applet和绘制火焰的效果的Image对象、Applet和绘制火焰的效果的Graphics对象、火焰效果的线程、Applet的高度,图片到图片装载器、绘制火焰效果的X坐标...

    java源码包3

     Java绘制图片火焰效果,源代码相关注释:前景和背景Image对象、Applet和绘制火焰的效果的Image对象、Applet和绘制火焰的效果的Graphics对象、火焰效果的线程、Applet的高度,图片到图片装载器、绘制火焰效果的X坐标...

    Java开发技术大全(500个源代码).

    loadClass.java 动态装载一个类 Shape.java 一个用于测试的简单类 useArray1.java 用反射机制使用数组示例1 useArray2.java 用反射机制使用数组示例2 第10章 示例描述:本章学习泛型。 demoBounds.java 演示有...

    java源码包2

     Java绘制图片火焰效果,源代码相关注释:前景和背景Image对象、Applet和绘制火焰的效果的Image对象、Applet和绘制火焰的效果的Graphics对象、火焰效果的线程、Applet的高度,图片到图片装载器、绘制火焰效果的X坐标...

    java反编译 jad

    软件装入到eclipse中后,不用装载程序源码就可以打开.class文件看源码

    JVM中编译Class、内存回收、多线程原理和使用

    JVM负责装载class文件并执行,因此,首先是JDK如何将Java代码编译为class文件、如何装载class文件及如何执行class,将源码编译为class文件的实现取决于各个JVM实现或各种源码编译器。class文件通常由类加载器...

    深入Java虚拟机(原书第2版).pdf【附光盘内容】

    第5-20章深入描述了java技术的内部细节,包括垃圾收集、java安全模型、java的连接模型和动态扩展机制、class文件、运算及流程控制等等,其中等6章和附录a-c完全可以作为class文件和指令含集的参考手册。本书还附带...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    图片到图片装载器、绘制火焰效果的X坐标,Y坐标、得到X坐标,Y坐标值、绘制火焰效果Image…… Java加密解密工具集 JCT v1.0源码包 5个目标文件 内容索引:JAVA源码,综合应用,JCT,加密解密 WDSsoft的一款免费源代码 JCT ...

    Java Web框架Play Framework v2.1.0.zip

    此框架自动编译和重新装载源文件的任何改变。 2、智能捆绑HTTP参数到Java方法参数。 3、基于Apache Mina的快速HTTP服务器。 4、一个基于Groovy的强大的模板引擎,具有多层继承,定制用户标签的能力,等。 5、...

    10命令参数。自定义异常.rar

    Java 在运行已编译完成的类时,是通过 java 虚拟机来装载和执行的,java 虚拟机通过操作 系统命令 JAVA_HOME\bin\java –option 来启动,-option 为虚拟机参数,JAVA_HOME 为JDK 安装路径,通过这些参数可对虚拟机的...

    Java重点知识总结

    Application、Applet程序结构 ,Java程序编译、运行过程 ,Application命令行参数 包的概念 ,常用包(结合后面的内容,了解一些类所在的包) 包的导入 , 声明类所在的包 第2章 标识符与关键字 ,注释形式 ,8种...

    java类文件混合加密算法的研究与分析_邹煜.caj

    近年来,企业和java开发人员针对java类文件的保护,在对java底层类加 载机制的深度分析后,提出了一系列的保护措施,如本地编译、代码隔离技术、 代码混淆技术、数字水印技术。本文对Java类...

    深入Java虚拟机

    3.12 Java安全模型的不足和今后的发展 方向 3.13 和体系结构无关的安全性 3.14 资源页 第4章 网络移动性 4.1 为什么需要网络移动性 4.2 一种新的软件模式 4.3 Java体系结构对网络移动性的支持 4.4 ...

Global site tag (gtag.js) - Google Analytics