本文为作者原创,转载请注明出处(http://www.cnblogs.com/mar-q/)by 负赑屃

巴山楚水凄凉地,二十三年弃置身。
怀旧空吟闻笛赋,到乡翻似烂柯人。
沉舟侧畔千帆过,病树前头万木春。
今日听君歌一曲,暂凭杯酒长精神。

一、什么是Java字节码?

借用Algorithm(4th)节选:它是程序的一种低级表示,可以运行于Java虚拟机上。将程序抽象成字节码可以保证Java程序在各种设备上的运行。OK,这个回答可以让我们回到程序执行上来看下一个问题:

二、程序是怎么执行的?

学习过计算机的同学都应该深恶痛绝一门课程——编译原理,这门课程的主要目的就是向你解释你所见所写的代码的执行过程。我们通常使用的C++、Java、python等等都属于高级计算机语言,但是计算机只能够理解“0”和“1”也就是二进制机器码,所以高级程序语言要在机器上执行需要把自己翻译成二级制机器码,这个翻译的过程主要是由编译器来完成的,例如C++程序编译后在Windows平台可以形成.exe的可执行文件,而在Unix或者Linux平台则会编译形成.dll文件,不同平台的C++编译器是不同的。

三、Java程序是怎么执行的?

Java要复杂一些,因为Java具有跨平台特性,为了实现这个特性Java执行在一台虚拟机上,这台虚拟机也就是JVM,Java通过JVM屏蔽了不同平台之间的差异,从而做到一次编译到处执行。JVM位于Java编译器和OS平台之间,Java编译器只需面向JVM,生成JVM能理解的代码,这个代码即字节码,JVM再将字节码翻译成真实机器所能理解的二进制机器码。

四、字节码是怎么产生的?

我们所编写的程序都是.java格式,通常在执行的时候也许点击一下eclipse的运行键就可以在控制台看到运行结果,但是也可以更酷一些,如果你装了JDK,那就可以直接在以命令行的方式编译运行你的.java文件,编译后会形成.class文件,这个.class文件即字节码。

例如:可以用文本新建一个HelloWorld.java文件:

public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello Java");
}
}

打开命令行进入文件目录,输入编译命令:javac HelloWorld.java

若程序没有错误,在当前目录下就会生成同名的HelloWorld.class文件。此时在命令行中输入java HelloWorld就可以看到程序执行结果: Hello Java

为了验证它的跨平台特性,我们把.class拿到Windows平台验证一下:

结果是相同的。

java的命令行功能是很丰富的,不再一一赘述,当然聪明人还是会用一个好的IDE。

五、字节码怎么解读?

字节码长什么样子呢?打开.class文件看看:

这就是上面那段HelloWorld的字节码,的确是以字节形式呈现出来的。四不四看起来头晕,四不四除了开头的cafebabe其他都不认识,其实还好啦,你只要知道字节码就是用字节对应关键字,比如开头的cafebabe对应的就是文件编码格式,对应表示.class文件的魔数,后面的0034表示版本号。

为什么要这样呢?我们再回到第二个问题:程序是怎么执行的,机器能够理解的就是二进制机器码,可是我们编译器在翻译的时候不能直接搞成“0”和“1”啊,不然这么多编程语言,这么多编译器,会死人滴,学过计算机基础的都应该熟悉这样一张图(图片源自百度百科):

是的,高级语言转为机器语言还有一层汇编语言,这是一种符号语言,上手简单,编写困难,通常被应用在底层,硬件驱动程序、嵌入式操作系统和实时运行程序都需要汇编语言,也就是说高级语言的编译器并不是直接将代码转成二进制的,二是转成汇编语言,再通过汇编指令转成机器码。回到Java,字节码其实和汇编语言之间是有对应关系的,当然,字节码要更丰富一些。

关于字节码的解读,不是一两句话能说清楚的,改天再填坑,如果真的有兴趣,可以去看一本书《深入浅出JVM》,有几个解读的传送门如下:

http://blog.csdn.net/dc_726/article/details/7944154/

http://www.importnew.com/13107.html

六、解读字节码有什么意义?

可以让你明白程序的执行原理,方便在理解后优化代码,当然,还能干坏事。。。

聊聊Java的字节码的更多相关文章

  1. 【java虚拟机系列】从java虚拟机字节码执行引擎的执行过程来彻底理解java的多态性

    我们知道面向对象语言的三大特点之一就是多态性,而java作为一种面向对象的语言,自然也满足多态性,我们也知道java中的多态包括重载与重写,我们也知道在C++中动态多态是通过虚函数来实现的,而虚函数是 ...

  2. java虚拟机字节码执行引擎

    定义 java虚拟机字节码执行引擎是jvm最核心的组成部分之一,它做的事情很简单:输入的是字节码文件,处理过程是字节码解析的等效过程,输出的是执行结果.在不同的虚拟机实现里,执行引擎在执行java代码 ...

  3. java class 字节码

    java class 字节码 协议: class文件 魔数(Magic):4byte -> 0xCAFEBABE 类似2f3f 版本(Version):4Byte -> 0x0000003 ...

  4. 小师妹学JVM之:java的字节码byte code简介

    目录 简介 Byte Code的作用 查看Byte Code字节码 java Byte Code是怎么工作的 总结 简介 Byte Code也叫做字节码,是连接java源代码和JVM的桥梁,源代码编译 ...

  5. 使用java动态字节码技术简单实现arthas的trace功能。

    参考资料 ASM 系列详细教程 编译时,找不到asm依赖 用过[Arthas]的都知道,Arthas是alibaba开源的一个非常强大的Java诊断工具. 不管是线上还是线下,我们都可以用Arthas ...

  6. JAVA的字节码技术

    1.什么是字节码? 字节码 byteCode JVM能够解释执行的.java程序的归宿,但是从规范上来讲和Java已没有任何关系了.一些动态语言也可以编译成字节码在JVM上运行.字节码就相当于JVM上 ...

  7. Java虚拟机--字节码指令集

    1. 字节码指令集简介: Java虚拟机的指令由一个字节长度的,代表着某种特定操作含义的操作码(Opcode)以及跟随其后的零至多个代表此操作所需参数的操作数(Operands)所构成.虚拟机中许多指 ...

  8. Java Class 字节码文件结构详解

    Class字节码中有两种数据类型: 字节数据直接量:这是基本的数据类型.共细分为u1.u2.u4.u8四种,分别代表连续的1个字节.2个字节.4个字节.8个字节组成的整体数据. 表:表是由多个基本数据 ...

  9. Java 动态字节码技术

    对 Debug 的好奇 初学 Java 时,我对 IDEA 的 Debug 非常好奇,不止是它能查看断点的上下文环境,更神奇的是我可以在断点处使用它的 Evaluate 功能直接执行某些命令,进行一些 ...

随机推荐

  1. MinHook测试与分析(x86下 E8,E9,EB,CALL指令测试,且逆推测试微软热补丁)

    依稀记得第一次接触Hook的概念是在周伟民先生的书中-><<多任务下的数据结构与算法>>,当时觉得Hook的本质就是拦截,就算到现在也是如此认为. 本篇文章是在x86下测 ...

  2. bookStore案例第一篇【部署开发环境、解决分类模块】

    前言 巩固Servlet+JSP开发模式,做一个比较完整的小项目 成果图 该项目包含了两个部分,前台和后台. 前台用于显示 后台用于管理 该项目可分为5个模块来组成:分类模块,用户模块,图书模块,购买 ...

  3. Mysql中设置默认时间为当前值

    1.直接在创建表时添加该列并声明默认值,如下: CREATE TABLE `table1` ( `id` ) NOT NULL, `createtime` timestamp NULL default ...

  4. php显示距当前多长时间

    <?php header("Content-type: text/html; charset=utf-8");date_default_timezone_set('PRC') ...

  5. String类的常见面试题(3)

    1.判断定义为String类型的s1和s2是否相等 String s1 = "abc"; //这个"abc"对象首先会进常量池 String s2 = &quo ...

  6. ArrayList,LinkedListd等容器使用时注意点:

    1.对这两个List(包括其他的类似容器),如果向里面加入一个元素(引用数据类型),那么这个List里面保存的是这个对象的引用: 如果想要避免这种现象可以这样:在加入新的元素时不直接压,将已有的对象复 ...

  7. jquery对象和js对象

    <ul id="ul1">   <li id="li_1">01</li>   <li>02</li> ...

  8. vue组件初学--弹射小球

    1. 定义每个弹射的小球组件( ocicle ) 2. 组件message自定义属性存放小球初始信息(可修改) { top: "0px", //小球距离上方坐标 left: &qu ...

  9. 修改Form ->Top和Left 造成的莫名其妙的显示异常 “轴信息”

    相关代码: 运行程序: 要等待很久,或者把主窗体最小化,再最大化打开"轴信息" 才会恢复正常. 这个"不爽"很蛋蛋 ,网友亲亲们,有独到见解的亲亲们,期待得到你 ...

  10. TETELaser Cutting System 不连续吹起的问题

    TETELaser Cutting System 不连续吹起的问题    :配置 加工参数-->机器参数-->信号灯和激光器报警:黄灯索引==EX14   红灯索引==EX15 绿灯索引= ...