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...
JVM(Java Virtual Machine)是Java语言的虚拟机,它提供了一个平台独立的环境,用于执行Java字节码。在JVM中,内存屏障被用来维持语言层并发原语的语义。JVM会在合适的时刻插入内存屏障,以确保多线程程序的正确...
Krakatau的汇编器语法主要是Jasmin语法的超集,但有一些不兼容,但是与Jasmin不同,Krakatau完全支持所有Java 14功能,甚至还支持旧版本JVM中的一些未记录的功能。 Krakatau还提供了用于将Java二进制文件转换为可...
smali 和 baksmali 则是针对 DEX 执行文件格式的汇编器和反汇编器, 反汇编后 DEX 文件会产生.smali 后缀的代码文件, smali 代码拥有特定的格式与语法, smali 语言是对 Dalvik 虚拟机字节码的一种解释。
Java 虚拟机(JVM)是负责对字节码解释执行的。 Java 虚拟机(JVM)是 Java 平台的核心组件之一,它提供了一个环境,使得 Java 字节码可以在不同平台上运行。 2. Java 标识符 Java 中的标识符是区分大小写的。 ...
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 字节码,...