快速业务通道

深入Java编程:Java的字节代码 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15
() { }   // Methods   public static void main(String[]  args) {     System.out.println("Hello world");   } }

编译好这个类以后,可以用一个十六进制编辑器打开.class文 件,再通过虚拟机说明规范来解释字节代码的含义,但这并不是好方法。利用 javap,可以将字节代码转换****们可以阅读的文字,只要加上-c参数:

javap -c ExampleOfByteCode

输出结果如下:

Compiled from ExampleOfByteCode.java public class  ExampleOfByteCode extends java.lang.Object {     public  ExampleOfByteCode();     public static void main (java.lang.String[]); } Method ExampleOfByteCode()    0 aload_0    1 invokespecial #6 <Method  java.lang.Object()>    4 return Method void  main(java.lang.String[])    0 getstatic #7 <Field  java.io.PrintStream out>    3 ldc #1 <String "Hello  world">    5 invokevirtual #8 <Method void  println(java.lang.String)>    8 return

从以上 短短的几行输出代码中,可以学到关于字节代码的许多知识。在main方法的第一 句指令是这样的:

0 getstatic #7 <Field java.io.PrintStream out>

开头的初始数字是指令在方法中的偏移,所以第一个指令的偏移 是0。紧跟偏移的是指令助记符。在本例中,getstatic指令将一个静态字段压入 一个数据结构,我们称这个数据结构为操作数堆栈。后续指令可以通过此结构引 用这个字段。紧跟getstatic指令后面的是压到哪个字段中去。这里的字段是 “#7 <Field java.io.PrintStream out>”。如果直接察看字 节代码,这些字段信息并没有直接存放到指令中去。事实上,就象所有Java类使 用的常量一样,字段信息存储在共享池中。在共享池中存储字段信息可以减小字 节代码的大小。这是因为指令仅仅需要存储的是整型索引号,而不是将整个常量 存储到常量池中。本例中,字段信息存放在常量池的第七号位置。存放的次序是 由编译器决定的,所以看到的是“#7”。

通过分析第一行指令 ,我们可以看出猜测其它指令的含义还是比较简单的。“ldc”(载入 常量)指令将常量“Hello, World.”压入操作数堆栈。 “invokevirtual ”激发println方法,此方法从操作数堆栈中弹出 两个参数。不要忘记象println这样的方法有两个参数:明显的一个是字符串参数 ,加上一个隐含的“this”引用。

深入Java编程:Java的字节代码(3)

时间:2011-09-04 comprg.com.cn

二、Java字节代码是怎样使 程序避免程序的内存错误

Java程序设计语言一直被称为internet的安全语 言。从表面上看,这些代码象典型的C++代码,安全从何而来?安全的重要方面是 避免程序的内存错误。计算机罪犯利用程序的内存错误可以将他们的非法代码加 到其它安全的程序中去。Java字节代码是站在第一线抵御这种攻击的

1.类 型安全检测实例

以下的例子可以说明Java具体是怎样做的。

public float add(float f, int n) { return f +  n; }

如果你将这段代码加到第一个例子中去,重新编译, 运行javap,分析情况如下:

Method float add(float, int)    0 fload_1    1 iload_2    2 i2f     3 fadd    4 freturn

在Java方法的开头,虚拟机 将方法的参数放到一个被称为举办变量表的数据结构中。从名字就可以看出,局 部变量表包含所有声明的局部变量。在本例中,方法从三个局部变量表实体开始 ,这些是add方法的三个参数。位置0保存该方法返回类型

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号