Java字节码揭秘——第三部分

接上一部份:

 

以下是一个简单的异常处理例子:
 
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规范来了解。


本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/BU_BetterYou/archive/2008/06/18/2560972.aspx

YOLOv9分割训练自己数据和推理训练好模型,并教你使用Labelme工具标注数据(附YOLOv9分割模型结构图),全网最详细教程 YOLOv9 通过研究数据传输时的信息丢失问题,提出了可编程梯度信息(PGI)和通用高效层聚合网络(GELAN)架构,提高了参数利用率和模型性能。与 SOTA 方法相比,GELAN 仅使用传统卷积算子即可实现更好的参数利用率。PGI 适用于从轻型到大型的各种模型,使从头开始训练的模型能够获得更好的结果。YOLOv9 被评价为新的 SOTA 实时目标检测器。接下来本文手把手教你训练自己分割数据集和推理训练好的分割模型。 阅读详情

相关推荐

YOLOv8环境搭建+训练自己的数据详细项目

直接按照路径会有问题,找到自己 requirements.txt 文件路径,我这里是pip install -r D:\ultralytics-main\ultralytics-main\requirements.txt。首先去自己的anaconda的安装的envs(虚拟环境),在导航栏输入cmd,进入命令窗口。到官方网站下载yolo模型 ,下载好后解压,里面有个文件requirements.txt。然后安装ultralytics ,这是必须的。

m0_63172128的博客 2万+

Java字节码揭秘——第四部分

 实践中的Java字节码对Java字节码有了一定了解之后,我们可以来看看一些常用的和熟悉的Java语言的内容是如何与字节码映射的,也可以获得一些Java实现的细节内容。 Java 5:自动封装(autoboxing)Java 5版本的一个新特性是自动封装(autoboxing),基础数据类型因语义环境的需要能转换成为对象类型,例如: public class Autobox

BU_BetterYou的专栏 4203

AutoCAD2014与ObjectARX开发环境搭建实战指南

本文提供了一份详细的AutoCAD2014与ObjectARX开发环境搭建实战指南。内容涵盖从AutoCAD2014、Visual Studio 2010及ObjectARX 2014 SDK的版本匹配与环境准备,到Wizard安装、编码问题解决、Visual Studio配置,并最终通过一个完整的绘图命令开发示例,手把手引导开发者创建并加载第一个可运行的ObjectARX插件,为后续深入开发奠定坚实基础。

weixin_28475533的博客 286

Java字节码

Java最黑科技的玩法就是字节码编程,也就是动态修改或是动态生成 Java 字节码。使用字节码可以玩出很多高级的玩法,最高级的还是在 Java 程序运行时进行字节码修改和代码注入。听起来是不是一些很黑客,也很黑科技的事?是的,这个方式使用 Java 这门静态语言在运行时可以进行各种动态的代码修改,而且可以进行无侵入的编程。 比如,我们不需要在代码中埋点做统计或监控,可以使用这种技术把我们的监控代码...

螃蟹士兵 1万+

ESP32S3电池电量监测实战:从分压电路到IDF组件配置(附GitHub源码)

本文详细介绍了ESP32S3电池电量监测的完整实战方案。从硬件分压电路的电阻选型、滤波设计,到软件层面利用ESP-IDF的ADC校准机制提升精度,并重点讲解了如何集成bat_monitor开源组件快速实现电压采集、电量计算、充电检测与事件通知。文章提供了从原理到调试的完整指南和GitHub源码,帮助开发者构建稳定可靠的物联网设备电源管理系统。

ee345的博客 530

K8S证书过期解决办法之替换证书

k8s证书过期解决方案之替换证书

q_hsolucky的博客 1万+

JAVA字节码分析

以下是Java字节码(.classJava字节码是基于的二进制流,按顺序紧凑排列,无分隔符。

Android资深专家,chromium 内核开发者 1242

5分钟快速验证lvgl界面:VScode模拟器极简配置法(免环境变量版)

本文介绍了一种5分钟快速验证LVGL界面的极简配置方法,使用VSCode模拟器免环境变量配置,适合UI设计师和产品经理快速预览界面效果。通过预编译的SDL2库和配置好的VSCode工程模板,实现开箱即用的LVGL界面验证,大幅提升工作效率。

weixin_30790841的博客 314

java字节码

Java之所以可以“一次编译,到处运行”,一是因为JVM针对各种操作系统、平台都进行了定制,二是因为无论在什么平台,都可以编译生成固定格式的字节码(.class文件)供JVM使用。因此,也可以看出字节码对于Java生态的重要性。之所以被称之为字节码,是因为字节码文件由十六进制值组成,而JVM以两个十六进制值为一组,即以字节为单位进行读取。

zhangjunli的博客 2555

忍者安全渗透系统(NINJITSU OS V3)的安装详细过程,亲测新旧vm版本都可安装,附带下载来源

忍者安全渗透系统(NINJITSU)的安装详细过程,亲测新旧vm版本都可安装,附带下载来源

1万+

串口通信协议

文章目录前言一、串口通信结构图二、电平三、串口通信协议 前言 本文记录的是平时常用的串口通信有关知识点 提示:以下是本篇文章正文内容,下面案例可供参考 一、串口通信结构图 1、RS232标准串口通讯结构图 2、USB转串口通讯结构图 3、原生的串口到串口 二、电平 串口通信的时候,有三种电平:TTL电平、RS232电平、USB电平 TTL电平是从MCU直接出来的电平 RS323是一种通讯标准,因为高电平+15V低电平–15V电位差30V容错空间大,抗干扰能力强,一般用于工业设备直接通信电平转换芯

weixin_43772611的博客 6849

详解JAVA字节码

一文详解JAVA字节码

BugMan的博客 3380

50、压电微泵与技术设备驱动的研究分析

本文研究了压电微泵在弹性微通道中的流体流动特性及技术设备驱动的振动行为。通过建立轴对称流固耦合模型,利用FreeFem++进行数值模拟,分析了不同数量压电致动器和频率对微泵流量的影响,发现多个致动器按特定时序压缩可产生净正向流量,并提出了稳态流量的近似解析公式。同时,针对技术设备驱动系统,探讨了周期性负载引起的强迫振动特性,明确了共振条件及影响因素,并比较了主动、被动和优化设计等振动控制策略。最后展望了实验验证、多物理场耦合与智能控制等未来研究方向,为相关设备的优化设计与高效运行提供了理论支持。

convnet3designer的博客 148

揭秘 Java 字节码理解 JVM 的工作原理

下面这篇文章面向有 Java 基础但对 JVM 内部、字节码(bytecode)与运行机制不够熟悉的读者。文章分层次讲解核心概念,并通过代码实战展示怎么生成、查看与逐步理解字节码,帮助你把抽象概念变成可操作的技能。

一键难忘的博客 1370

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Java字节码揭秘——第一部分

 写在前面这一两年,在JVM上使用其他替代语言越来越热门了。现在至少有三门语言有幸在Java Community Process中得到了官方认可:JRuby、Groovy和Bean-Shell。另外,代号为野马(Mustang)的Java 6发布了包含了一个专为封装不同脚本引擎的API层,就像JDBC访问数据库的模式一样。再加上Java版本5也在语言本身上做了很大的调整。总之,就像我之前翻

BU_BetterYou的专栏 1万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Java字节码揭秘——第二部分

 Java字节码分类JVM字节码集合基本上是分为几个不同的大类的。我们不会逐一介绍字节码的操作符,我们讨论类别,然后着重拿出一些常用的操作符,其余的均可通过JVM规范来获取详情。 堆栈操作。 pop、pop2:将堆栈的值弹出。pop2用来弹出64位的值,pop用来弹出32位的。 dup、dup2:复制堆栈顶端的值。用来形成高效的pop/push/push组

BU_BetterYou的专栏 3914

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

读懂Java字节码

目录 一、简单demo分析 字节码文件信息 常量池 方法表集合 二、分析try-catch-finally的demo 计算机只认识0和1。这意味着任何语言编写的程序最终都需要经过编译器编译成机器码才能被计算机执行。所以,我们所编写的程序在不同的平台上运行前都要经过重新编译才能被执行。 而Java刚诞生的时候曾经提过一个非常著名的宣传口号: "一次编写,到处运行"。为了实现该目的,Sun...

l1394049664的博客 6848

《字节码运行机制揭秘:反射、代理、Javassist 原理与实战》

本文深入解析Java字节码运行机制及其关键技术应用。文章首先介绍了JVM执行引擎工作流和字节码结构,通过.class文件格式和反编译示例展示字节码指令执行过程。重点剖析了反射机制的核心流程和性能优化方法,对比了不同调用方式的性能损耗。在动态代理方面,详细讲解了JDK动态代理实现原理,并与CGLIB进行特性对比。最后通过Javassist和ASM的实战示例,演示了运行时字节码修改技术,包括动态创建类和方法增强等高级应用场景。全文构建了从原理到实践的完整知识体系,为理解Java动态能力提供了技术支撑。

qq_43414012的博客 1113

【潜意识Java】深度探索Java字节码

家人们,今天来深挖 Java 中极为底层却又无比关键的部分 —— 字节码。平常我们编写 Java 代码,可能很少直接接触字节码,但它却是 Java 程序运行的基石。理解字节码,能让你透彻明白 Java 程序是如何在虚拟机里运行的,无论是排查问题,还是优化代码,都离不开它。我也是在不断钻研中才把它摸透,现在就把这些宝贵经验分享给大伙。

潜意识Java的博客 853

JVM-Java字节码的组成部分

字节码文件的结构和内容是由Java编译器生成的,而JVM负责解释和执行这些字节码指令。常量池是Java字节码文件的一个重要部分,它包含了各种常量,如字符串、类和字段引用、方法描述符等。常量池是一个表格结构,每个常量都有一个索引,通过这个索引可以在常量池中查找具体的常量。Java字节码文件是一种由Java编译器生成的二进制文件,用于在Java虚拟机(JVM)上执行Java程序。方法定义包括方法的访问修饰符、名称、方法描述符(参数类型和返回类型的描述)、方法的字节码指令序列以及异常表。

m0_51663233的博客 674

Java字节码解读

Java最重要的一个机制就是虚拟机JVM,通过执行编译好的字节码.class文件,可以实现跨平台的可移植性,那么小伙伴们会不会好奇字节码文件是怎样的,它是怎么工作的?参考来源,为了便于回顾,特此按自己思路重头来一遍,接下来我们就一起来解读一下字节码文件,前方高能,大脑请提前清空。 1. 前期准备 1.1 首先编写一个测试程序,简单地在main方法中声明一个Integer包装类型变量i和一个基本类型int类型变量n,代码如下。 public class EnTest { public s.

走过路过不要错过 1089

Java字节码,字节码指令

各种字节码指令的相关介绍,方法重载和重写在字节码层面的实现原理和机制,字节码的查看和分析方法简单介绍

m0_66668867的博客 1748

什么是Java字节码?

什么是字节码? Java之所以可以“一次编译,到处运行”,一是因为JVM针对各种操作系统、平台都进行了定制,二 是因为无论在什么平台,都可以编译生成固定格式的字节码(.class文件)供JVM使用。因此,也可以看 出字节码对于Java生态的重要性。之所以被称之为字节码,是因为字节码文件由十六进制值组成,而 JVM以两个十六进制值为一组,即以字节为单位进行读取。在Java中一般是用javac命令编译源代码为字 节码文件。 对于开发人员,了解字节码可以更准确、直观地理解Java语言中更深层次的东西,比如通过

wangkexiang21的博客 3599

java字节码_Java字节码:

有关字节码以及此处显示的字节码的信息基于Java 2 SDK Standard Edition v1.2.1 javac编译器。 其他编译器生成的字节码可能略有不同。 为什么要理解字节码? 字节码是Java程序的中间表示,就像汇编程序是C或C ++程序的中间表示一样。 最有名的C和C ++程序员知道他们要为其编译的处理器的汇编程序指令集。 在调试以及进行性能和内存使用调整时,此知识至关...

cusi77914的博客 742

微软技术日报 11-09:.NET 8 与 9 明日同时停止支持,注册表编辑器出了 WinUI 3 版

今天这四条消息的共同点是收口。.NET 8 和 9 的支持期到点,注册表编辑器的新界面只放在仓库里给人看,GitHub 把一类危险触发器按住默认,微软在安全报告里把防线从地址黑名单挪到行为。收口并不等于关门。.NET 10 还在支持期里,被按住的触发器可以用策略按文件放回来,实验室里的样例随时可能变成产品。区别在于这些动作要有人签字,不再是默认开着。如果今天只做一件事,去看一眼构建机上的 .NET 版本。明天之后,8 和 9 的漏洞补丁不会再来了。

海盗Sharp的博客 300
上一篇: Java字节码揭秘——第二部分
下一篇: Java字节码揭秘——第四部分
topinking
博客等级 码龄20年 15粉丝 242原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值