public class TestTryCatch { public static void main(String[] args) { TestTryCatch test = new TestTryCatch(); System.out.println(test.fun()); System.out.println(test.fun2()); } public int fun() { int i = 10; try { return i; } finally { i = 20; } } public StringBuilder fun2() { StringBuilder s = new StringBuilder("Hello"); try { //doing something s.append("Word"); return s; } catch (Exception e) { return s; } finally { s.append("finally"); } } }
javap -c TestTryCatch.class 之后,就可以看见了
Compiled from "TestTryCatch.java" public class cn.com.flamezealot.base.jvm.trycatch.TestTryCatch { public cn.com.flamezealot.base.jvm.trycatch.TestTryCatch(); Code: 0: aload_0 1: invokespecial #8 // Method java/lang/Object."<init>":()V 4: return public static void main(java.lang.String[]); Code: 0: new #1 // class cn/com/flamezealot/base/jvm/trycatch/TestTryCatch 3: dup 4: invokespecial #16 // Method "<init>":()V 7: astore_1 8: getstatic #17 // Field java/lang/System.out:Ljava/io/PrintStream; 11: aload_1 12: invokevirtual #23 // Method fun:()I 15: invokevirtual #27 // Method java/io/PrintStream.println:(I)V 18: getstatic #17 // Field java/lang/System.out:Ljava/io/PrintStream; 21: aload_1 22: invokevirtual #33 // Method fun2:()Ljava/lang/StringBuilder; 25: invokevirtual #37 // Method java/io/PrintStream.println:(Ljava/lang/Object;)V 28: return public int fun(); Code: 0: bipush 10 10入栈顶 2: istore_1 栈顶数据保存到局部变量数组第2个位置 3: iload_1 取出第2个局部变量入栈顶 4: istore 4 栈顶数据保存到第5个局部变量 6: bipush 20 20入栈顶 8: istore_1 栈顶数据保存到第2个局部变量 9: iload 4 第5个局部变量入栈顶 11: ireturn 返回 12: astore_2 栈顶数据放到局部变量数组第3个位置 13: iload_1 第2个局部变量的值放入栈顶 14: istore 4 栈顶数据保存到第5个局部变量 16: bipush 20 20入栈顶 18: istore_1 保存到第2个局部变量 19: iload 4 第5个局部变量值入栈顶 21: ireturn 返回 22: astore_3 栈顶数据放到局部变量数组第4个位置 23: bipush 20 20入栈顶 25: istore_1 保存到第2个局部变量 26: aload_3 局部变量数组第4个位置数据入栈顶 27: athrow 将栈顶的数值作为异常或错误抛出 Exception table: from to target type 3 6 12 Class java/lang/Exception 3 6 22 any 12 16 22 any public java.lang.StringBuilder fun2(); Code: 0: new #52 // class java/lang/StringBuilder 3: dup 复制一份对象引用,因为接下来要先初始化,再保存到变量,所以这里复制了一份 4: ldc #54 // String Hello 6: invokespecial #56 // Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V 类初始化会弹出一个引用 9: astore_1 另一个引用存入局部变量表2号位置 10: aload_1 11: ldc #59 // String Word 13: invokevirtual #61 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 16: pop 这里返回值没有赋给任何变量,所以pop出栈 17: aload_1 18: astore 4 20: aload_1 21: ldc #65 // String finally 23: invokevirtual #61 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 26: pop 27: aload 4 sotre、load的都是引用 29: areturn 30: astore_2 31: aload_1 32: astore 4 34: aload_1 35: ldc #65 // String finally 37: invokevirtual #61 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 40: pop 41: aload 4 43: areturn 每次return前都会执行fianlly里的方法 44: astore_3 45: aload_1 46: ldc #65 // String finally 48: invokevirtual #61 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 51: pop 52: aload_3 53: athrow 异常处理前也会执行finally里的方法 Exception table: from to target type 10 20 30 Class java/lang/Exception 10 20 44 any 30 34 44 any }
jvm的指令集说明可以看这里
相关推荐
课程简介: 目前,Java是最为流行的编程语言之一,它的基础平台就是JVM。除了Java,如JRuby、Scala、Clojure等语言也运行在JVM平台。...介绍JVM的字节码以及反汇编方法,同时介绍JIT相关的参数和应用。
根据官方jvm指令转化的中文版jvm指令手册,包含 java反汇编指令以及对应的机器码和操作的具体含义,对于英文吃力的人是一大福音。
Lilac是一个工具套件,其中包含JVM(Java虚拟机)字节码的汇编程序和反汇编程序。 汇编程序采用以类似于汇编程序的语法编写的Java类的文本表示形式,并将它们转换为二进制Java类文件,然后可以将其加载到JVM中。 反...
jvm常用的指令,是分析字节码反汇编的必备指令 常用的指令 > iconst_0 将int类型常量0压入栈 > istore_1 将int类型值存入局部变量1 > iconst_0 将int类型常量0压入栈 > istore_2 将int类型值存入局部变量2 > iload_1...
Krakatau的汇编器语法主要是Jasmin语法的超集,但有一些不兼容,但是与Jasmin不同,Krakatau完全支持所有Java 14功能,甚至还支持旧版本JVM中的一些未记录的功能。 Krakatau还提供了用于将Java二进制文件转换为可...
smali 和 baksmali 则是针对 DEX 执行文件格式的汇编器和反汇编器, 反汇编后 DEX 文件会产生.smali 后缀的代码文件, smali 代码拥有特定的格式与语法, smali 语言是对 Dalvik 虚拟机字节码的一种解释。
Toothpick是一个工具包,用于从Clojure惯用地生成可检查的汇编程序字节码。 它旨在用于编译器和翻译器,但是真正冒险的人无疑可以执行手动代码生成并强制JVM执行结果。 牙签与臀部的,这是牙签的开发目标体系结构。...
smali 和 baksmali 则是针对 DEX 执行文件格式的汇编器和反汇编器, 反汇编后 DEX 文件会产生.smali 后缀的代码文件, smali 代码拥有特定的格式与语法, smali 语言是对 Dalvik 虚拟机字节码的一种解释。
第2章-Java并发机制的底层实现原理Java 代码在编译后会变成 Java 字节码,字节码被类加载器加载到 JVM 里,JVM 执行字节码,最终需要转化为汇编
JVM 上运行相对低级的语言(例如 C)。 LLJVM 提供的 C 到 JVM 字节码编译涉及几个步骤。 源代码首先由前端(例如llvm-gcc或 . 然后将 LLVM IR 转换为汇编代码,链接到其他 Java 类,然后汇编为 JVM 字节码。 与使用...
可以这样想 :java 语言 ->类文件(字节码文件)->汇编语言->二进制码) 4.大多数java标准版本平台都会取个代码名称(code name),如Java SE 7 dolphin(海豚) 5.从大到小,包含与被包含:java se:java 语言、jdk...
一个Java类的assambler。 该程序为JVM汇编Java字节代码指令,如为CPU的MASM。 强烈需要Java字节码指令的知识。
tdd-字节码一个项目,演示了如何持续编译汇编程序并使用 Clojure 对其进行测试。 您可以使用这样的设置通过学习 Java 字节码。 使用和任务。开发第一次组装和测试: boot watch test然后,编辑并保存 - 您应该会再次...
synchronize底层实现原理 Java文件想要看字节码通常使用 javap 命令将java的class文件反汇编,具体操作步骤如下:...经过以上3步骤,你会看到一些字节码指令,其实这才是最终运行在jvm上的机器指令代码。 public class
我以前的本科学位论文具有与ARM体系结构相关的经验,这与之类似,只是将JVM字节码转换为ARM。 为此,我选择的工具是用于拆卸的用于elf标头的 ,然后决定使用进行输出:这样,我的翻译器将生成汇编程序,然后NASM会...
然后使用 jasmin 汇编器将 .j 文件编译为字节码。 有几个预编译的 jvm 类为实现 go 数据结构提供运行时支持,在最后一步中,这些类被复制到 go 生成的类文件中。 依赖关系 OCaml(以及 ocamllex 和 ocamlbuild) ...
4.2.7 HSDIS:JIT生成代码反汇编 4.3 JDK的可视化工具 4.3.1 JConsole:Java监视与管理控制台 4.3.2 VisualVM:多合一故障处理工具 4.4 本章小结 第5章 调优案例分析与实战 5.1 概述 5.2 案例分析 5.2.1 高...
高级:易于人类阅读的代码,与二进制或汇编相反。 编译型语言和解释型语言的混合体:人类可读的代码被编译或转换成一种更适合计算机阅读的形式 比如C++代码编译成二进制 另一方面,Java 代码被编译成 Java 字节码,...
本项目是从类文件(Java字节码)到LL文件(LLVM IR汇编器)的编译器。 结果文件可以通过 llvm-as 编译为独立的二进制 ELF 文件。 特征: 没有JDK,没有JVM Linux x86_64 目标架构 极小的尺寸(~10-20 kB 普通程序...
多亏了 JVMCI,我可以使用-XX:+EnableJVMCI -XX:+UseJVMCICompiler -Djvmci.Compiler=yarrow选项在运行时轻松地将编译器插入JVM。 由于JVMCI是一项实验性功能,因此仅将其服务公开给Graal编译器后端(这是JVMCI的...