Java应用程序的开发周期包括编译、下载 、解释和执行几个部分。简单来说,Java代码的编译和执行的整个过程大概是:开发人员编写Java代码(.java文件),然后将之编译成字节码(.class文件),再然后字节码被装入内存,一旦字节码进入虚拟机,它就会被解释器解释执行,或者是被即时代码发生器有选择的转换成机器码执行。

Java程序从源文件创建到程序运行要经过两大步骤:
1、源文件由编译器编译成字节码(ByteCode)
2、字节码由java虚拟机解释运行。
因为java程序既要编译也要经过JVM的解释运行,所以说Java被称为半解释语言.

编译class

Java代码编译是由Java源码编译器来完成,流程图如下所示:

这里写图片描述

  刚开始学习java的时候,我们并没有用到IDE编辑器,我们先是使用 javac Demo.java编译,然后 使用java Demo执行程序,java编译过程中,需要经过1、分析和输入到符号表,2、注解处理(.class文件中,所有的注解都被清空),3、语义分析和生成class文件

   生成的class文件中,最后生成的class文件由以下部分组成:

  1. 结构信息。包括class文件格式版本号及各部分的数量与大小的信息
  2. 元数据。对应于Java源码中声明与常量的信息。包含类/继承的超类/实现的接口的声明信息、域与方法声明信息和常量池
  3. 方法信息。对应Java源码中语句和表达式对应的信息。包含字节码、异常处理器表、求值栈与局部变量区大小、求值栈的类型记录、调试符号信息

这里写图片描述

JVM

这里写图片描述

这里写图片描述

类加载机制

  在JVM中,最后的文件都是Class文件,也就是字节码文件,因此需要把该文件加载到JVM中才能运行。而加载的过程,只会执行静态代码块。
  类加载器分为三种:BootStrapClassLoader加载器,ExtensionClassLoader标准扩展加载器,AppClassLoader系统类加载器。
  在Java中,类的加载使用了双亲委托模型,简单来讲,子类的类加载器找不到,就会找父类的加载器,就这样一级一级的找,最好找到了BootStrapClassLoader类加载器,这个BootStrapClassLoader是用C语言写的,所以它是没有父类的,

这里写图片描述

  下面是测试例子,会发现各自的类加载路径以及加载器的名称,到了最后的BootStrapClassLoader,发现没有父类加载器了,因为这已经到头了,所以返回NULL

package com.yellowcong.test;

public class Demo {

    public static void main(String[] args) {

        //类加载器的设计,使用的是双亲委托模型
        //SystemClassLoader系统类加载器
        ClassLoader classLoader = Demo.class.getClassLoader();
        System.out.println(classLoader);
        //AppClassLoader和ExtensionClassLoader 两个都没有类加载器,就会找上一级的加载器
        System.out.println(classLoader.getClass().getClassLoader());

        //AppClassLoader加载的class
        System.out.println(System.getProperty("java.class.path"));

        //ExtensionClassLoader标准扩展加载器
        ClassLoader extClassLoader = classLoader.getParent();
        System.out.println(extClassLoader);
        System.out.println(extClassLoader.getClass().getClassLoader());
        System.out.println(System.getProperty("java.ext.dirs"));

        //引导类加载器,这个BootStrapClassLoader加载器使用的是C语言写的所以找不到
        ClassLoader bootStrapClassLoader = extClassLoader.getParent();
        System.out.println(bootStrapClassLoader);
        System.out.println(System.getProperty("sun.boot.class.path"));

    }
}
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐