Java整个编译以及运行的过程相当繁琐,本文通过一个简单的程序来简单的说明整个流程。
如下图,Java程序从源文件创建到程序运行要经过两大步骤:1、源文件由编译器编译成字节码(ByteCode) 2、字节码由java虚拟机解释运行。因为java程序既要编译同时也要经过JVM的解释运行,所以说Java被称为半解释语言( "semi-interpreted" language)。
图1 java程序编译运行过程
下面通过以下这个java程序,来说明java程序从编译到最后运行的整个流程。代码如下:
//MainApp.java public class MainApp { public static void main(String[] args) { Animal animal = new Animal("Puppy"); animal.printName(); } } //Animal.java public class Animal { public String name; public Animal(String name) { this.name = name; } public void printName() { System.out.println("Animal ["+name+"]"); } }
第一步(编译): 创建完源文件之后,程序会先被编译为.class文件。Java编译一个类时,如果这个类所依赖的类还没有被编译,编译器就会先编译这个被依赖的类,然后引用,否则直接引用,这个有点象make。如果java编译器在指定目录下找不到该类所其依赖的类的.class文件或者.java源文件的话,编译器话报“cant find symbol”的错误。
编译后的字节码文件格式主要分为两部分:常量池和方法字节码。常量池记录的是代码出现过的所有token(类名,成员变量名等等)以及符号引用(方法引用,成员变量引用等等);方法字节码放的是类中各个方法的字节码。下面是MainApp.class通过反汇编的结果,我们可以清楚看到.class文件的结构:
图2 MainApp类常量池
图3 MainApp类方法字节码
第二步(运行):java类运行的过程大概可分为两个过程:1、类的加载 2、类的执行。需要说明的是:JVM主要在程序第一次主动使用类的时候,才会去加载该类。也就是说,JVM并不是在一开始就把一个程序就所有的类都加载到内存中,而是到不得不用的时候才把它加载进来,而且只加载一次。
下面是程序运行的详细步骤:
- 在编译好java程序得到MainApp.class文件后,在命令行上敲java AppMain。系统就会启动一个jvm进程,jvm进程从classpath路径中找到一个名为AppMain.class的二进制文件,将MainApp的类信息加载到运行时数据区的方法区内,这个过程叫做MainApp类的加载。
- 然后JVM找到AppMain的主函数入口,开始执行main函数。
- main函数的第一条命令是Animal animal = new Animal("Puppy");就是让JVM创建一个Animal对象,但是这时候方法区中没有Animal类的信息,所以JVM马上加载Animal类,把Animal类的类型信息放到方法区中。
- 加载完Animal类之后,Java虚拟机做的第一件事情就是在堆区中为一个新的Animal实例分配内存, 然后调用构造函数初始化Animal实例,这个Animal实例持有着指向方法区的Animal类的类型信息(其中包含有方法表,java动态绑定的底层实现)的引用。
- 当使用animal.printName()的时候,JVM根据animal引用找到Animal对象,然后根据Animal对象持有的引用定位到方法区中Animal类的类型信息的方法表,获得printName()函数的字节码的地址。
- 开始运行printName()函数。
图4 java程序运行过程
特别说明:java类中所有public和protected的实例方法都采用动态绑定机制,所有私有方法、静态方法、构造器及初始化方法<clinit>都是采用静态绑定机制。而使用动态绑定机制的时候会用到方法表,静态绑定时并不会用到。本文只是讲述java程序运行的大概过程,所以并没有细加区分。本文的所述的流程非常粗糙,想深入了解的读者请查阅其他资料。存在谬误的地方,请多指正。
参考资料:
相关推荐
总的来说,“编译和运行Java程序的小工具”是一个便捷的开发辅助软件,它通过集成编译和运行过程,使得Java开发变得更加轻松快捷。无论是新手学习还是资深开发者快速测试,都能从中受益。如果你是Java开发者,不妨...
Java 编译与运行是Java开发中的基础...总结起来,Java的编译和运行过程涉及到JVM、JDK和JRE的使用,以及环境变量的配置。了解这些基础知识对于学习和使用Java编程至关重要,同时也为更深入的Java开发奠定了坚实的基础。
其次,学生需要使用 Java 的编译器 javac 将源程序编译为字节码文件。例如,c:>javac example.java 如果源程序的语法正确,将生成与主文件名相同的而扩展名为 .class 的文件,例如,example.class 如果编译出错,...
Java反编译是将已编译的字节码(.class文件)转换回源代码(.java文件)的过程。在开发或维护项目时,如果原始的源代码丢失...此外,掌握基本的Java字节码知识也是有帮助的,因为这有助于理解反编译过程和可能的限制。
Java代码快捷编译运行工具是针对初学者设计的一款实用程序,旨在简化Java编程过程中常见的编译和运行步骤。对于刚接触Java编程的开发者来说,通过命令行(CMD)进行源码的javac编译和java运行可能会感到繁琐,而这款...
在"Java在线编辑编译运行示例"中,"JavaOnlineRunner"可能是这样一个在线平台的名字,它可能包含了一个完整的环境,让用户能够轻松体验到从编写到运行Java程序的全过程。这样的平台对于那些没有安装Java环境或者需要...
在日常的软件开发过程中,开发者经常会遇到需要在命令行环境下编译和运行Java程序的情况。本文将详细介绍如何在DOS(Disk Operating System)环境下,通过命令行工具编译和运行Java程序。 #### 创建目录结构 在...
### Java程序编译与运行 Java是一种跨平台的编程语言,其源代码文件后缀为.java。一个Java程序要运行,需要经历编译和运行两个基本步骤。首先,Java源代码会被编译成Java字节码,这是一种中间表示,可以在任何安装...
Java 程序编译和运行过程: 1. 编写 Java 程序:使用文本编辑器或 IDE 编写 Java 程序,扩展名为 .java。 2. 编译 Java 程序:使用 javac 命令编译 Java 程序,生成 .class 文件。 3. 加载字节码:Java 解释器加载 ...
Java 命令行编辑的基础知识包括编译和运行 Java 程序。编译 Java 程序可以使用 javac 命令,例如编译 HelloWorld.java 文件可以使用以下命令:javac HelloWorld.java。运行 Java 程序可以使用 java 命令,例如运行 ...
通常情况下,Java程序在运行前需要通过`javac`命令将.java源文件编译成.class字节码文件,然后通过`java`命令执行。但在某些场合,我们可能希望在程序运行时动态地编译新的.java文件,以便快速响应代码变动。 Java...
Java程序在执行时,会先由Java编译器将源代码编译成字节码,这些字节码存储在.class文件中。Java虚拟机(JVM)再将字节码解释执行。而反编译就是逆向这个过程,通过特定的工具将字节码还原成接近原始的Java源代码。...
标题提及的“把Java程序编译成可执行文件的工具”主要指的是Java的JAR打包工具。JAR文件是一种特殊的归档格式,它可以将多个Java类文件、资源文件以及元数据打包在一起,形成一个单一的文件,便于分发和执行。JAR...
Java程序的编译和运行过程是学习Java编程的基础,也是理解其工作原理的关键。 一、Java程序的编译 在Java中,源代码文件通常以`.java`为扩展名,这些文件包含了Java类的定义。编译Java程序的步骤如下: 1. **编写...
在编译或运行过程中,可能会遇到各种错误,如语法错误、类型错误、运行时异常等。错误信息会显示在命令行窗口,帮助开发者定位问题。 6. **多文件项目**: 如果项目包含多个类,每个类应保存在单独的`.java`文件...
在DOS环境下(CMD)编译和运行Java程序是学习Java编程的基础技能之一。这个过程主要涉及以下几个步骤: 1. **启动DOS命令行**:首先,你需要打开DOS命令行窗口。这可以通过点击“开始”菜单,选择“运行”,然后...
下面我们将详细讲解如何编译和运行包含JAR包的Java程序。 1. **编译Java源代码** 在Java开发中,首先我们需要将.java源代码文件编译成.class字节码文件。这通常通过`javac`命令完成。例如,如果你有一个名为`Main...
5. **编译与运行过程**: 编译Java源代码是通过执行`javac HelloWorld.java`命令来完成的,这会生成一个`HelloWorld.class`文件。接着,运行Java程序使用`java HelloWorld`命令,这里的`HelloWorld`是主类的无扩展...
Java程序的编写到运行是一个涉及多个步骤的过程,涵盖了从源代码创建、编译到执行的整个生命周期。让我们详细探讨一下这个过程。 1. **编写阶段**: 在这个阶段,开发人员使用Java集成开发环境(IDE)如Eclipse、...
总的来说,“小颖Java源代码反编译专家 V1.4终极版”作为一款强大的Java反编译工具,能够为开发者提供便利,尤其是在需要理解和调试无源代码的Java程序时。然而,使用任何反编译工具都应谨慎,并且始终尊重软件的...