`
onedaykoo
  • 浏览: 25235 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

使用javap分析return和finally的执行字节码

    博客分类:
  • J2SE
 
阅读更多
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 数组对象
1
1
分享到:
评论
2 楼 onedaykoo 2011-09-02  
黑白两相望 写道
我想知道你的字节码是从命令行拷出来的吗?后面的注释是后面加上的? 还是说用了什么插件?


恩,是的。不是插件。
1 楼 黑白两相望 2011-09-01  
我想知道你的字节码是从命令行拷出来的吗?后面的注释是后面加上的? 还是说用了什么插件?

相关推荐

    使用类分解器Javap分析Java字节码

    此外,`JVMIS.pdf`文件可能包含了更多关于Java虚拟机(JVM)内部结构和字节码解释的信息,这对于深入理解`Javap`的工作原理和Java程序的运行时行为至关重要。建议读者阅读此文档以获得更全面的知识。 总之,`Javap`...

    HelloWorld的javap -verbose HelloWorld 字节码初探

    标签“源码”和“工具”表明这篇内容将围绕Java源代码的编译结果(字节码)以及使用`javap`这一工具进行分析展开。源码是程序员编写的应用程序的原始形式,而字节码是Java虚拟机(JVM)执行的二进制代码,它是源码...

    轻松看懂Java字节码.pdf

    标题《轻松看懂Java字节码.pdf》中隐藏的知识点是理解Java字节码的重要性及如何轻松掌握。描述中提到Java字节码是...通过实践和使用相关工具,可以使得阅读和分析字节码变得更加容易,从而更好地优化和维护Java程序。

    JVM 字节码从入门到精通

    在了解JVM字节码之前,对于Java程序员而言,掌握Java底层知识,尤其是虚拟机和字节码的工作原理,对于成为一名优秀的开发者是很有帮助的。因此,本文从最简单的Java程序——打印"Hello, World"开始,逐步介绍如何将...

    4.程显峰--Java字节码技术1

    `add`方法的字节码非常直观,主要由`iload`(加载整数到堆栈)、`iadd`(执行加法操作)和`ireturn`(返回结果)指令组成。这显示了JVM如何通过字节码执行简单的方法调用。 总之,Java字节码技术是Java平台的基石,...

    java字节码编辑器

    使用这样的工具需要具备一定的技术背景,包括Java虚拟机原理、字节码指令集以及可能的辅助工具,如JDK的`javap`命令用于查看字节码,或`jad`工具进行反编译。 总之,Java字节码编辑器是一个强大的工具,它为开发者...

    从一个class文件深入理解Java字节码结构

    方法表包含方法的元数据,如方法名、返回类型、参数列表和字节码指令。 8. **属性表** 附加属性表提供额外信息,如`Code`属性包含了方法的实际字节码,`Exceptions`属性记录了可能抛出的异常,`Annotations`和`...

    JAVA字节码JAVA字节码.doc

    Java 字节码编程 Java 字节码是 Java 程序的中间表示形式,它可以被 Java...Java 字节码是 Java 程序的中间表示形式,了解 Java 字节码可以帮助开发者更好地理解 Java 程序的执行机制,提高程序的执行效率和排除错误。

    javap使用(1).docx

    通过 `javap`,开发者能够深入了解 Java 编译器是如何处理源代码并生成字节码的,这对于优化程序性能和理解 Java 虚拟机 (JVM) 的工作原理至关重要。 #### 二、基本概念 在深入了解 `javap` 的使用之前,我们首先...

    字节码解析01.rar

    字节码是Java虚拟机(JVM)理解和执行的一种中间表示形式。它允许Java程序在任何支持Java的平台上运行,实现了“一次编写,到处运行”的目标。本教程主要关注如何解析Java字节码,特别是对`.class`文件的分析。 ...

    2021-2022年收藏的精品资料软件工程师Java字节码开发深入解析教程解释.docx

    本教程将探讨Java字节码的组织形式以及如何使用`javap`命令来查看和分析字节码。 1. **Java字节码的组织形式** - 类文件结构:每个Java类文件都以魔数`OxCAFEBABE`开头,用于识别文件格式。接着是小版本号和大版本...

    Java运行原理 javap命令运行结果

    接下来我们将对给定的字节码文件进行分析,以更好地理解Java程序是如何被编译和执行的。 #### 四、案例文件解析 根据给定的部分内容,我们可以看到这是一个名为`Demo1.class`的文件,该文件最后修改于2018年11月16...

    Java字节码(.class文件)格式详解((转载)

    开发者可以使用反编译工具,如`javap`,来查看和理解字节码。此外,还有一些工具,如JBE(Java Bytecode Editor),可以用于编辑和调试字节码,这对于深入学习JVM的工作原理和进行代码混淆等高级操作非常有用。 在...

    Class(字节码)了解基础

    通过使用javap工具,我们可以对编译后的Class文件进行反编译,从而查看其结构和字节码指令。这有助于开发者理解Java虚拟机如何加载和执行Java类,也是深入分析和优化Java程序性能的基础。 总的来说,Class文件中的...

    javap使用说明文档

    * 分析和调试 Java 程序 * 了解 Java 程序的执行机制 * 提高 Java 程序的执行效率 javap 是一个功能强大且灵活的命令行工具,能够帮助开发者更好地了解 Java 编译器内部的工作机制,并提高程序执行的效率。

    java 之方法调用 方法传参 值传递还是引用传递字节码

    本文将深入探讨Java中的方法调用、值传递与引用传递,并通过字节码分析来进一步理解这些概念。 首先,我们来看方法调用。在Java中,方法是一组完成特定任务的代码块,可以通过方法名来调用执行。方法调用的基本语法...

    基于字节码搜索的Java反序列化漏洞调用链挖掘方法.zip

    Java字节码是JVM(Java虚拟机)执行的指令集,可以通过反编译工具如jad或javap查看。这种方法的关键在于识别可能的危险操作,例如通过`java.io.ObjectInputStream.readObject()`进行反序列化的代码段。 挖掘调用链...

    字节码文件结构详解.docx

    Java 语言以其“一次编写,到处运行”的特性深受开发者喜爱,这一特性主要依赖于 Java 虚拟机(JVM)对字节码文件的执行。当我们编写 Java 源代码(.java 文件)后,通过编译器将其转换为对应的字节码文件(.class ...

    java虚拟机源码-jvm_based_compiler:该程序实现了递归下降解析器,将源代码转换为字节码,以便生成的字节码可以在Java虚拟

    Java虚拟机(JVM)是Java程序运行的基础,...通过使用递归下降解析器,源代码被转换为可由JVM执行的字节码,从而实现了跨平台的代码执行。对于那些想要探索编译器内部运作和JVM技术的人来说,这是一个不容错过的机会。

Global site tag (gtag.js) - Google Analytics