一个Java程序的执行过程(转)

我们手工执行java程序是这样的:

1、在记事本中或者是UE的文本编辑器中,写好源程序;

2、使用javac命令把源程序编译成.class文件;

编译后的.class(类字节码)文件中会包含以下内容:

ConstantPool:符号表;

FieldInfo:类中的成员变量信息;

MethodInfo:类中的方法描述;

Attribute:可选的附加节点。

FieldInfo节点包含成员变量的名称,诸如public,private,static等的标志。ConstantValue属性用来存储静态的不变的成员变量的值。Deprecated和Synthetic被用来标记一个成员变量是不被推荐的或由编译器生成的。

3 有了.class文件,我们执行 java 解释命令就可以运行java程序了。

现在我们主要讨论一下,当执行 java这个命令后,会发生什么事情呢?

首先,JVM装载.class,也就是类装载器装载类字节码。一个类装载器本身也是一个java类,所以,类装载器自身也需要被另外一个类装载器装载,这就出现了类似先有蛋,还是先有鸡的问题。但JAVA中的类装载器的这个问题却很容易解决。
JAVA的虚拟机(JVM)中内嵌了一个称为Bootstrap类装载器,它是用特定于操作系统的本地代码实现的,属于JAVA虚拟机的内核,Bootstrap类不用专门的类装载器去进行装载。Bootstrap类负责加载JAVA核心包中的类(即rt.jar文件中的类),这些类的Class.getClassLoader()方法返回值为null,即表示是Bootstrap类装载器。
JAVA核心包中有另外两个类装载器:ExtClassLoader和AppClassLoader,它们都是用JAVA语言编写的JAVA类,其中
ExtClassLoader类装载负责加载存放在<JAVA_HOME>/jre/lib/ext目录下的jar包中的类,
AppClassLoader负责加载应用程序的启动执行类,即当使用java命令去启动执行一个类时,JAVA虚拟机使用AppClassLoader加载这个类。

在编译和运行JAVA程序时,都会通过ExtClassLoader类装载器去<JAVA_HOME>/jre/lib/ext目录下的JAR包中搜索要加载的类,所以,如果将包含例如Servlet API的jar包或者是javamail.jar包复制到该目录下,在编译Servlet或JavaMail程序时,就不必在CLASSPATH环境变量中增加包含Servlet API的jar包或者是javamail.jar包文件。

以上,就是一个JAVA程序执行的大致过程。

http://blog.csdn.net/jjeggplant4000/article/details/2130300

时间: 2024-12-20 16:19:30

一个Java程序的执行过程(转)的相关文章

一个C#程序的执行过程

可能很多人都知道我们把程序打包成dll就丢出去了,但是里面的具体的执行过程是怎么样的呢. 程序集是由元数据和IL组成的.IL是和CPU无关的语言,是微软的几个专家请教了外面的编译器的作则,开发出来的.IL比大多数机器语言都要高级一点.IL能够访问和操作对象类型,并提高了指令来初始化对象,调用对象上的虚方法以及直接操作数组元素. 比如下面这个例子 class Program { static void Main(string[] args) { Console.WriteLine("Hello&q

Java异常处理机制就是程序代码执行过程

我也是通过各种方式在进行验证是否可以满足我们的需求,今天我就发现了一个问题.现在我们来一起说明一下,这个可能不算是bug,而应该需要我们记住就可以了. 对于一副灰度图像I,她的每一个像素点I(x,y)都有一个灰度值,一般情况下可能的灰度取值有2^8=256个(0,1,...,255).如果我们统计出灰度值r在I中出现的次数n,并对其进行归一化(n/N,N是所有灰度值出现次数的总和),这样我们就可以得到像素r在I中出现的概率p(r).如果对每一个可能的灰度取值r都做同样的处理,我们可以得到如图1左

一个java程序员自学IOS开发之路(四)

根据上图,由于我是一个Java程序员,前面两个阶段还是学的比较快的,但是由于电脑配置不行,光是开启虚拟机登陆OS系统就卡的不要不要的了,在那里面写代码简直是煎熬= =,后面的UI学习又要启动ios模拟器,根本无法进行. 于是下定决心,入手一台Macbook pro,告别我用了四年的联想~今天本本到货啦,哈哈^_^,可以愉快的继续了 2015/10/14 Day 15 为了便于开发者打造各式各样的优秀app,UIKit框架提供了非常多功能强大又易用的UI控件 2015/10/16 Day 16 第

java 类 及其 执行过程

java 类 命名 java类文件中  只能有一个公开类  且 公开类类名与当前类文件的文件名一致 方法如果使用了static修饰,那么此方法是类方法,可以 类名.方法名 使用. 你的main方法在同一个类中,那么不需要写类名,直接写方法名就可以调用. 而没有使用static修饰的方法属于实例方法,必须创建此类的对象,通过对象调用此方法.如: Func2 f = new Func2(); f.shuchu(4,4); public class HelloWorld{ /** * main方法作为

《Java从小白到大牛精简版》之第3章 第一个Java程序

本书第一个Java程序是通过控制台输出HelloWorld,以这个示例为切入点,向大家系统介绍Java程序的编写.Java源代码结构以及一些基础知识. 在Java中,程序都是以类的方式组织的,Java源文件都保存为.java文件当中.每个可运行的程序都是一个类文件,或者称之为字节码文件,保存为.class文件.要实现在控制台中输出HelloWorld示例,则需要编写一个Java类. 3.1 使用Eclipse实现 HelloWorld示例可通过多种工具实现,这一节首先介绍如何通过Eclipse实

说说Python程序的执行过程

1. Python是一门解释型语言? 我初学Python时,听到的关于Python的第一句话就是,Python是一门解释性语言,我就这样一直相信下去,直到发现了*.pyc文件的存在.如果是解释型语言,那么生成的*.pyc文件是什么呢?c应该是compiled的缩写才对啊! 为了防止其他学习Python的人也被这句话误解,那么我们就在文中来澄清下这个问题,并且把一些基础概念给理清.   2. 解释型语言和编译型语言   计算机是不能够识别高级语言的,所以当我们运行一个高级语言程序的时候,就需要一个

java程序的执行

Java平台和语言最开始只是SUN公司在1990年12月开始研究的一个内部项目.SUN公司的一个叫做帕特里克·诺顿的工程师被自己开发的C和C语言编译器搞得焦头烂额,因为其中的API极其难用.帕特里克决定改用NeXT,同时他也获得了研究公司的一个叫做"Stealth 计划"的项目的机会. ??"Stealth 计划"后来改名为"Green计划",JGosling(詹姆斯·高斯林)和麦克·舍林丹也加入了帕特里克的工作小组.他们和其他几个工程师一起在加

第一个JAVA程序解析

上一篇博客中,我们编写了第一个JAVA程序并使用最原始的方式对其进行编译运行,很多文章或书籍中对该种编译运行方式不做介绍,但是我认为这有助于我们更好的了解.学习JAVA,是不可忽略的一部分,在我身边有很多人,学完一段时间JAVA后,只知道如何在IDE中进行开发,却不知脱离IDE后该如何运行,不得不说这也是一种悲哀. 言归正传,我们来看一下上一篇博客中的例子"Hello World",这也是几乎所有的编程语言都会编写的一个例子,非常的经典. 下面我们就来分析一下: /**  *  我的第

二、第一个JAVA程序——HelloWorld

1.Java程序的运行机制. Java源文件的后缀名为java 形如 *.java,通过编译器编译后生成*.class文件,由计算机来运行class文件执行java程序.但是,此时所指的计算机并不是物理上的计算机而是java的虚拟机,即JVM. Java中所有的程序都是运行在JVM上的,即所有的*.class文件在JVM上运行而对于*.class文件来说只需要符合JVM的规范就可以了,而不需要考虑对硬件或者其他操作系统的兼容性.再由JVM去适应各个操作系统,因此,有了java的一句口号一次编译,