深入Java编程:Java的字节代码 - 编程入门网
,位置1和2保存浮点和 整型参数。
为了真正操纵变量,它们必须被装载(压)到操作数堆栈。第 一条指令fload_1将浮点参数压到操作数堆栈的位置1。第二条指令iload_2将整型 参数压到操作数堆栈的位置2。有趣的是这些指令的前缀是以“i”和 “f”开头的,这表明Java字节代码的指令按严格的类型划分的。如果 参数类型与字节代码的参数类型不符合,虚拟机将拒绝不安全的字节代码。更妙 的是,字节代码被设计成仅执行一次类型安全检查——当加载类的时 候。 2.Java中的类型安全检测 类型安全是怎样增强系统安全性的 呢?如果攻击者可以让虚拟机将整型变量当成浮点变量,或更严重更多,很容易 预见计算的崩溃。如果计算是发生在银行账户上的,牵连的安全问题是很明显的 。更危险的是欺骗虚拟机将整型变量编程一个对象引用。在大多数情况下,虚拟 机将崩溃,但是攻击者只要找到一个漏洞即可。不要忘记攻击者不需要手工查找 ——更好且容易的办法是写一个程序产生大量变换的坏的字节代码, 直到找到一个可以危害虚拟机的。 另一种字节代码保护内存安全的是数组操作。“aastore”和 “aaload”字节代码操作Java数组,而它们一直要检查数组的边界。 当调用者超越数组边界时,这些字节代码将产生数组溢出错误 (ArrayIndexOutOfBoundsException)。也许所有应用中最重要的检测是分支指 令,例如,以“if.”开始的字节代码。在字节代码中,分支指令在同 一个方法中只能跳转到另一条指令。向方法之外传递控制的唯一办法是返回,产 生一个异常,或执行一个唤醒(invoke)指令。这不仅关闭了许多易受攻击的大 门,也防止由伴随引用和堆栈的崩溃导致的可恶的程序错误。如果你曾经用系统 调试器打开过代码中随机定位的程序,你对这些程序错误会很熟悉。 需要 着重指出的是:所有的这些检测是由虚拟机在字节代码级上完成的,不仅仅是编 译器。其它编程语言的编译器象C++的,可以防止一些我们在上面讨论过的内存错 误,但这些保护是基于源代码级的。操作系统将读入执行任何机器代码,而不管 这些代码是由小心翼翼的C++编译器还是由邪恶的攻击者产生的。简单地说,C++ 是在源程序级上是面向对象的,而Java的面向对象特性扩展到已经编译好的字节 代码上。 深入Java编程:Java的字节代码(4)时间:2011-09-04 comprg.com.cn三、怎样通过分析字节代码来提高程序的执行效率 不管你注意它们与 否,Java字节代码的内存和安全保护都客观存在,那为什么还要那么麻烦去看字 节代码呢?其实,就如在DOS下深入理解汇编就可以写出更好的C++代码一样,了 解编译器怎样将你的代码翻译成字节代码可帮助你写出更有效率的代码,有时候 甚至可以防止不知不觉的程序错误。 1.为什么在进行字符串合并时要使用 StringBuffer来代替String 我们看以下代码:
试想一下每个方法需要执行 多少函数。编译该程序并执行javap,输出结果如下:
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |