一个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程序执行的大致过程。
注:部分内容摘自张孝祥老师的<深入体验Java Web开发内幕--核心基础>第4章的内容
 
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值