`

【转帖】Java字节码揭秘(三)

    博客分类:
  • java
阅读更多
原帖地址:http://blog.csdn.net/BU_BetterYou/archive/2008/06/18/2560972.aspx

接上一部份:


以下是一个简单的异常处理例子:


public class ExFun

{

        public static void main(String[] args)

        {

               try

               {

                       System.out.println("In try block");

                       throw new Exception();

               }

               catch (java.io.IOException ioEx)

               {

                       System.out.println("In catch IOException block");

                       System.out.println(ioEx);

               }

               catch (Exception ex)

               {

                       System.out.println("In catch Exception block");

                       System.out.println(ex);

               }

               finally

               {

                       System.out.println("In finally block");

               }

        }

}


字节码为:


Compiled from "ExFun.java"

public class ExFun extends java.lang.Object

        SourceFile: "ExFun.java"

        minor version: 0

        major version: 50

        Constant pool:

               (snipped for simplicity)

{

public ExFun();

        (snipped for simplicity)



public static void main(java.lang.String[]);

        Code:

               Stack=2, Locals=3, Args_size=1

               0: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;

               3: ldc #3; //String In try block

               5: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V

               8: new #5; //class java/lang/Exception

               11: dup

               12: invokespecial #6; //Method java/lang/Exception."<init>":()V

               15: athrow

               16: astore_1

               17: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;

               20: ldc #8; //String In catch IOException block

                22: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V

               25: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;

               28: aload_1

               29: invokevirtual #9; //Method java/io/PrintStream.println:(Ljava/lang/Object;)V

               32: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;

               35: ldc #10; //String In finally block

               37: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V

               40: goto 81

               43: astore_1

               44: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;

               47: ldc #11; //String In catch Exception block

               49: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V

               52: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;

               55: aload_1

               56: invokevirtual #9; //Method java/io/PrintStream.println:(Ljava/lang/Object;)V

               59: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;

               62: ldc #10; //String In finally block

               64: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V

               67: goto 81

               70: astore_2

               71: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;

               74: ldc #10; //String In finally block

               76: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V

               79: aload_2

               80: athrow

               81: return

        Exception table:

               from to target type

               0 16 16 Class java/io/IOException

               0 16 43 Class java/lang/Exception

               0 32 70 any

               43 59 70 any

               70 71 70 any

        LineNumberTable: (snipped)

        StackMapTable: (snipped)

}


“try”块内的操作符是在0~16的范围内,Java源代码的“catch”块是被编在异常(Exception)表的开始两行(0(来自)~16(目标)~16(类型) java.io.IOException,0~6~43 java.lang.Exception),catch的操作符偏移量分别是16和43。也需要注意的是,异常表的最后三行表明了方法的其他地方抛出异常的情况(在异常块内部也一样),必须跳转到操作符70处来进行finally块的处理。而且需要注意的是,每个catch块都会对应一个finally块,所以finally块在字节码中重复出现了两次。这只是一个简单的例子,让我们看见了javac编译产生的字节码输出。

JVM字节码集合有212个操作符,46个保留字为后续扩展使用。完全的集合可以通过JVM规范来了解。
分享到:
评论

相关推荐

    转帖经典---JAVA设计模式

    在Java中,设计模式分为三类:创建型模式、结构型模式和行为型模式。 创建型模式关注于对象的创建,它们包括: 1. 单例模式(Singleton):确保一个类只有一个实例,并提供全局访问点。 2. 工厂方法模式(Factory ...

    论坛转帖工具.rar

    标题中的“论坛转帖工具.rar”表明这是一个用于在论坛之间转移帖子的软件工具,通常用于帮助用户方便地将一个论坛的帖子内容复制到另一个论坛,可能是为了分享信息、讨论或保存重要的帖子。这类工具可能包括自动抓取...

    UBB论坛转帖圣手.exe

    UBB论坛转帖圣手.exeUBB论坛转帖圣手.exe

    贴吧转帖工具

    使用此类工具时,用户需要确保其安全性,因为任何第三方工具都可能存在潜在风险,如账号安全问题、软件携带病毒等。同时,遵循贴吧社区的规定,合理、合法使用转帖工具,避免滥用导致账号被封禁。 此外,工具的使用...

    转帖PLCDCSFCS三大控制系统的特点和差异.doc

    转帖PLCDCSFCS三大控制系统的特点和差异 PLC、DCS、FCS 三大控制系统是自动化技术中的热点,各有其特点和差异。下面对这三大控制系统的特点和差异进行分析。 1.PLC(Programmable Logic Controller) PLC 是一种...

    编辑人员转帖去水印工具

    本篇文章将详细探讨“编辑人员转帖去水印工具”,并介绍如何使用名为Teorex Inpaint的1.0.0.2版本的软件来实现这一目标。 首先,我们要理解什么是水印。水印通常是指在图像或视频中添加的半透明标记,它可以是文字...

    discuz X2转帖工具、采集工具

    三、使用注意事项 1. 法律合规:使用这类工具时,必须确保所发布的帖子内容合法,不侵犯他人权益,遵循网络道德规范,尤其是版权法和隐私保护。 2. 论坛规则:每个论坛都有自己的规定,使用批量发帖工具前,应了解并...

    J2ME全方位开发讲解基础汇总[转帖]

    J2ME全方位开发讲解基础汇总[转帖] 一、J2ME中需要的Java基础知识 现在有大部分人,都是从零开始学J2ME的,学习J2ME的时候,总是从Java基础开始学习,而且现在讲Java基础的书籍中都是以J2SE来讲基础,这就给学习造成...

    转帖工具ConvertX fordiscuz7.1/7.2 修改增强版.rar

    1.修改自Convert X转帖工具 2.新增批量替换关键词(原来是单个词语替换,可以利用这个...5.新增按颜色屏蔽干扰码 6.新增减少缩进以及优化了首行缩进 7.优化一些小细节 8.重新布局优化显示及方便操作 9.不断更新中...

    [转帖]世界编程大赛第一名写的程序

    团队成员应根据各自的优势分配任务,如一人负责算法设计,另一人负责代码实现,第三人则专注于调试和优化。团队还需要建立一套有效的工作流程,确保每个人都能及时获取信息并协同工作。 6. **心理素质与时间管理**...

    转帖工具插件 for PHPwind 7.5 正式版.rar

    7. **安全与性能**:在使用任何第三方插件时,都应注意其可能带来的安全风险。虽然这个插件声称无需修改核心文件,但用户仍需关注插件的安全性,避免引入潜在的漏洞。 8. **故障排查**:如果在使用过程中遇到问题,...

    一键转帖功能插件 for 帝国CMS 6.0 GBK utf8 V1.0.rar

    这个插件的安装分为三个主要步骤: 1. **上传文件**:将`copyto.js`和`copyto.php`这两个关键文件复制并上传到帝国CMS系统的根目录下。这是为了让系统能够识别和调用这两个文件,以便实现一键转帖的功能。 2. **...

    一键转帖功能插件 for 帝国CMS v1.0.rar

    "一键转帖功能插件 for 帝国CMS v1.0.rar" 是一个专为帝国CMS设计的扩展工具,其主要目标是简化用户在网站上分享内容的过程,提高用户体验。这个插件允许用户轻松地将网站上的文章或信息复制并转发到其他平台,如...

    转帖图片提取工具 v1.0.zip

    转帖图片提取工具可以对论坛图片附件信息进行清除,只保留图片代码,操作很简单,推荐有需要转帖图片工具的朋友下载 转帖图片提取工具使用方法: 将IP138上处理过的东西复制到上方的编辑框内,点击只要图片,下面...

    Html2UBBMaxcj_Softii论坛专用转帖工具

    HTML2UBBMaxcj 是一款专为Softii论坛设计的转帖工具,它主要用于将HTML格式的帖子内容转换成UBB代码,以便在论坛中更好地显示和分享。UBB(Universal BBCode)是一种轻量级的标记语言,常用于网络论坛,与HTML类似,...

    论坛专用屏蔽干扰码转贴工具

    然而,在享受论坛便利的同时,用户经常会遇到一系列的问题,尤其是困扰他们的“干扰码”。这些干扰码主要用来防止恶意爬虫的爬取或出于对版权内容的保护,但无疑给正常用户的信息获取带来了不便。为了解决这一问题,...

    【转帖】 使用 JProfiler 监控 JBoss 运行情况

    JProfiler是一款功能强大的Java性能分析工具,它可以对Java应用程序、Applets、Java Web Start应用以及应用服务器进行性能监控与分析。通过深入地分析内存使用、线程活动、垃圾回收等关键性能指标,帮助开发人员及...

    超级无敌转帖手

    看到论坛里帖子由精美的图片想转过来,或者批量提取地址时很好用

    聊天机器人的小例子

    转帖:本项目是一个聊天机器人的小例子,使用的图灵(www.tuling123.com)提供的聊天api,javaapk之前也发布过一个聊天机器人http://www.javaapk.com/source/1488.html,现在的问答机器人只能分析关键字做一个简单的...

Global site tag (gtag.js) - Google Analytics