package com.****.test1;
/**
* try-finally的执行
* @author jame
* @date 2011年9月1日11:14:01
*/
public class ReturnTest {
public static void main(String[] args) {
System.out.println("main method:"+ReturnTest.test());
}
static int test()
{
int x = 1;
try
{
return x;
}
finally
{
++x;
System.out.println("finally:"+x);
}
}
}
Compiled from "ReturnTest.java"
public class com.skyon.test1.ReturnTest extends java.lang.Object{
public com.skyon.test1.ReturnTest();
//初始化工作
Code:
0: aload_0 //将局部变量0位置对象取出来,压入栈push
1: invokespecial #1; //Method java/lang/Object."<init>":()V //调父类构造函数
4: return //返回本函数
public static void main(java.lang.String[]);
Code:
0: getstatic #2; //Field a/lang/System.out:Ljava/io/PrintStream;
//取出静态成员变量push入栈,常量解析池中的#2位置
3: invokestatic #3; //Method test:()I
//调用test()方法
6: invokevirtual #4; //Method java/io/PrintStream.println:(I)V
//调用println()方法
9: return
static int test();
Code:
0: iconst_1 //将x变量的初始值1放入操作数栈
1: istore_0 //将栈顶元素保存到局部变量位置0,pop
2: iload_0 //将局部变量0位置对象取出来,压入栈push
3: istore_1 //将栈顶元素保存到局部变量位置1,pop
4: iinc 0, 1 //将栈顶元素自加1再入栈
7: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
10: iload_0
11: invokevirtual #4; //Method java/io/PrintStream.println:(I)V
14: iload_1
15: ireturn
16: astore_2
17: iinc 0, 1
20: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
23: iload_0
24: invokevirtual #4; //Method java/io/PrintStream.println:(I)V
27: aload_2
28: athrow
Exception table:
from to target type
2 4 16 any
16 17 16 any
常见指令:
1、putstatic #5;
--putstatic当栈顶元素出栈放到常量解析池中的#5位置
2、iconst_1
--int常量1放入操作数栈
3、aload_0
--将局部变量0位置对象取出来,压入栈push
4、invokespecial #1; //Method java/lang/Object."<init>":()V
--调用父类构造方法,并出栈pop
5、putfield #2; //Field A:[I
--putfield指把栈顶对象pop,然后赋值给常量解析池中的#2位置
6、getstatic #3; //Field/lang/System.out:Ljava/io/PrintStream;
--取出静态成员变量push入栈,常量解析池中的#3位置
7、 dup
--复制当前栈顶对象,再压入栈push
8、astore_1
--将返回对象放到局部变量位置1,pop
9、istore_2
--将栈顶元素保存到局部变量位置2,pop
10、iinc 2, 1
--将栈顶元素自加1再入栈
11、invokevirtual #8; //Method java/io/PrintStream.println:(I)
--调用打印方法
12、 bipush 6
--bipush将(byte)字节形转换成(int)整形,并且压入栈push
13、iastore
--数据元素操作指令:在位置上放入刚存入的值pop 1 ;pop 0; pop 数组对象
分享到:
相关推荐
此外,`JVMIS.pdf`文件可能包含了更多关于Java虚拟机(JVM)内部结构和字节码解释的信息,这对于深入理解`Javap`的工作原理和Java程序的运行时行为至关重要。建议读者阅读此文档以获得更全面的知识。 总之,`Javap`...
标签“源码”和“工具”表明这篇内容将围绕Java源代码的编译结果(字节码)以及使用`javap`这一工具进行分析展开。源码是程序员编写的应用程序的原始形式,而字节码是Java虚拟机(JVM)执行的二进制代码,它是源码...
标题《轻松看懂Java字节码.pdf》中隐藏的知识点是理解Java字节码的重要性及如何轻松掌握。描述中提到Java字节码是...通过实践和使用相关工具,可以使得阅读和分析字节码变得更加容易,从而更好地优化和维护Java程序。
在了解JVM字节码之前,对于Java程序员而言,掌握Java底层知识,尤其是虚拟机和字节码的工作原理,对于成为一名优秀的开发者是很有帮助的。因此,本文从最简单的Java程序——打印"Hello, World"开始,逐步介绍如何将...
`add`方法的字节码非常直观,主要由`iload`(加载整数到堆栈)、`iadd`(执行加法操作)和`ireturn`(返回结果)指令组成。这显示了JVM如何通过字节码执行简单的方法调用。 总之,Java字节码技术是Java平台的基石,...
使用这样的工具需要具备一定的技术背景,包括Java虚拟机原理、字节码指令集以及可能的辅助工具,如JDK的`javap`命令用于查看字节码,或`jad`工具进行反编译。 总之,Java字节码编辑器是一个强大的工具,它为开发者...
方法表包含方法的元数据,如方法名、返回类型、参数列表和字节码指令。 8. **属性表** 附加属性表提供额外信息,如`Code`属性包含了方法的实际字节码,`Exceptions`属性记录了可能抛出的异常,`Annotations`和`...
Java 字节码编程 Java 字节码是 Java 程序的中间表示形式,它可以被 Java...Java 字节码是 Java 程序的中间表示形式,了解 Java 字节码可以帮助开发者更好地理解 Java 程序的执行机制,提高程序的执行效率和排除错误。
通过 `javap`,开发者能够深入了解 Java 编译器是如何处理源代码并生成字节码的,这对于优化程序性能和理解 Java 虚拟机 (JVM) 的工作原理至关重要。 #### 二、基本概念 在深入了解 `javap` 的使用之前,我们首先...
字节码是Java虚拟机(JVM)理解和执行的一种中间表示形式。它允许Java程序在任何支持Java的平台上运行,实现了“一次编写,到处运行”的目标。本教程主要关注如何解析Java字节码,特别是对`.class`文件的分析。 ...
本教程将探讨Java字节码的组织形式以及如何使用`javap`命令来查看和分析字节码。 1. **Java字节码的组织形式** - 类文件结构:每个Java类文件都以魔数`OxCAFEBABE`开头,用于识别文件格式。接着是小版本号和大版本...
接下来我们将对给定的字节码文件进行分析,以更好地理解Java程序是如何被编译和执行的。 #### 四、案例文件解析 根据给定的部分内容,我们可以看到这是一个名为`Demo1.class`的文件,该文件最后修改于2018年11月16...
开发者可以使用反编译工具,如`javap`,来查看和理解字节码。此外,还有一些工具,如JBE(Java Bytecode Editor),可以用于编辑和调试字节码,这对于深入学习JVM的工作原理和进行代码混淆等高级操作非常有用。 在...
通过使用javap工具,我们可以对编译后的Class文件进行反编译,从而查看其结构和字节码指令。这有助于开发者理解Java虚拟机如何加载和执行Java类,也是深入分析和优化Java程序性能的基础。 总的来说,Class文件中的...
* 分析和调试 Java 程序 * 了解 Java 程序的执行机制 * 提高 Java 程序的执行效率 javap 是一个功能强大且灵活的命令行工具,能够帮助开发者更好地了解 Java 编译器内部的工作机制,并提高程序执行的效率。
本文将深入探讨Java中的方法调用、值传递与引用传递,并通过字节码分析来进一步理解这些概念。 首先,我们来看方法调用。在Java中,方法是一组完成特定任务的代码块,可以通过方法名来调用执行。方法调用的基本语法...
Java字节码是JVM(Java虚拟机)执行的指令集,可以通过反编译工具如jad或javap查看。这种方法的关键在于识别可能的危险操作,例如通过`java.io.ObjectInputStream.readObject()`进行反序列化的代码段。 挖掘调用链...
Java 语言以其“一次编写,到处运行”的特性深受开发者喜爱,这一特性主要依赖于 Java 虚拟机(JVM)对字节码文件的执行。当我们编写 Java 源代码(.java 文件)后,通过编译器将其转换为对应的字节码文件(.class ...
Java虚拟机(JVM)是Java程序运行的基础,...通过使用递归下降解析器,源代码被转换为可由JVM执行的字节码,从而实现了跨平台的代码执行。对于那些想要探索编译器内部运作和JVM技术的人来说,这是一个不容错过的机会。