`
bearsorry
  • 浏览: 93573 次
  • 性别: 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
分享到:
评论

相关推荐

    动态编译、加载java类

    在Java编程中,动态编译和加载类是一种高级特性,它允许程序在运行时编译源代码并将其加载到Java虚拟机(JVM)中。这种能力对于开发灵活性高、可扩展性强的应用程序非常有用,比如在服务器端处理动态生成的代码、...

    Web环境下Java表达式的动态编译与计算.pdf

    "Web环境下Java表达式的动态编译与计算" ...本文介绍了一种在Web环境下实现Java表达式的动态编译与计算的方法,该方法具有灵活性、可扩展性和高效性,能够满足Web应用程序对动态编译与计算的需求。

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

    过编译器和链接器转换成可执行程序的过程。 1. **CPU 体系结构与可执行文件格式**: 不同的CPU体系结构,如X86_64(CISC)和RISC(SPARC,PowerPC),具有不同的指令集,导致编译后的二进制代码无法直接在不同体系...

    Java虚拟机类装载机制

    类装载机制的目的是为了实现代码的动态加载和运行时的灵活性,允许程序在运行时发现和使用新的类,而无需重新编译或重启应用程序。 1. **装载过程** 装载过程是类装载机制的第一步,主要包括以下子步骤: - **...

    Java虚拟机类装载:原理、实现与应用.doc

    类装载过程不仅涉及基本的类查找和导入,还包含了链接、验证、准备、解析和初始化等多个阶段,这些步骤确保了Java程序的安全性和可靠性。 1. **装载过程**: - **装载**:这个阶段主要是寻找指定的类或接口的二...

    Java编译和解释执行对比及原理解析

    Java编译和解释执行对比及原理解析 Java编译和解释执行对比及原理解析主要介绍了Java编译和解释执行对比及原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以...

    Java深度历险(2)--深入类装载器

    类装载器是Java平台中极其重要的一部分,它不仅支撑着Java程序的动态性和安全性,还为开发高度灵活、安全和可扩展的应用程序提供了强大的支持。通过深入了解类装载器的工作原理和其实现方式,开发人员可以更好地利用...

    ClassGuard java类加密

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

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

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

    Java虚拟机(Java VM) msjavax86 微软java虚拟机

    在性能优化方面,Java虚拟机实现了诸如垃圾收集(Garbage Collection)、动态编译(Just-In-Time, JIT)等机制。垃圾收集自动管理内存,避免程序员手动处理内存泄露问题;JIT编译则是在运行过程中将频繁执行的热点...

    论文研究-Java软件的一种动态设计方法 .pdf

    该方法利用面向接口编程和Java的反射机制为开发者提供了一个统一的开发接口,使得软件能够实现功能的动态变化,以满足在软件维护阶段对系统进行调整的需求。通过这种动态设计方法,可以避免在添加新功能或更新原有...

    使用Java语言开发存储过程.doc.doc

    2. 装载Java代码和类:使用loadjava工具将Java源代码或二进制类文件装载到Oracle数据库中。 通过以上步骤,开发者可以在Oracle环境中使用Java语言开发出高效、安全且具有广泛适用性的存储过程,从而优化数据库管理...

    在dos窗口中编译和运行java文件的方法

    在DOS窗口中编译和运行Java文件的方法主要包括几个步骤,首先是配置环境变量,其次是编译Java文件,并最终运行编译后的类文件。下面将详细介绍这些步骤以及相关的知识点。 1. 环境变量配置 配置环境变量是让Windows...

    Java编程语言的基本原理.docx

    Java 编程语言的基本原理 Java 编程语言是当今最流行的编程语言之一,它的基本原理是确保 Java 程序可以跨平台运行...通过 javac.exe 和 java.exe 两个命令,可以将 Java 程序编译和执行,从而实现跨平台运行的功能。

    深入Java虚拟机

    类装载过程包括加载、验证、准备、解析和初始化五个阶段。加载是找到类的.class文件并将其读入内存;验证确保类文件的正确性和安全性;准备阶段为类的静态变量分配内存并初始化为默认值;解析将符号引用转换为直接...

    Oracle9i中JAVA和PL_SQL的互操作方法.pdf

    2. 装载和解析JAVA类:使用Oracle9i提供的命令行工具loadjava将编译好的JAVA字节码文件装载到数据库中。装载过程中,Oracle服务器将解析JAVA类,并将它们存储为数据库模式对象。 3. 发布JAVA类:装载到数据库中的...

    Java技术与Java虚拟机

    Java语言的运行流程涉及从编写源代码(.java文件)开始,经过编译生成字节码(.class文件)。字节码随后被加载到内存中的JVM,由解释器进行解释执行,或者在某些情况下,由即时编译器(JIT)转换为特定机器码执行,...

    jvm类装载器原理

    理解类装载器的工作原理对于优化Java应用性能和实现动态加载类至关重要。 装载过程包括三个主要步骤:装载、链接和初始化。装载阶段,类装载器依据指定的全限定类名(如`java.lang.Object`)去寻找对应的二进制数据...

Global site tag (gtag.js) - Google Analytics