深入Java编程:Java的字节代码 - 编程入门网
() { }
// Methods
public static void main(String[] args) {
System.out.println("Hello world");
}
}
编译好这个类以后,可以用一个十六进制编辑器打开.class文 件,再通过虚拟机说明规范来解释字节代码的含义,但这并不是好方法。利用 javap,可以将字节代码转换成人们可以阅读的文字,只要加上-c参数: javap -c ExampleOfByteCode 输出结果如下:
从以上 短短的几行输出代码中,可以学到关于字节代码的许多知识。在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具体是怎样做的。
如果你将这段代码加到第一个例子中去,重新编译, 运行javap,分析情况如下:
在Java方法的开头,虚拟机 将方法的参数放到一个被称为举办变量表的数据结构中。从名字就可以看出,局 部变量表包含所有声明的局部变量。在本例中,方法从三个局部变量表实体开始 ,这些是add方法的三个参数。位置0保存该方法返回类型 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |