`
netcome
  • 浏览: 479999 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

分析Java .class文件

    博客分类:
  • JAVA
阅读更多

出处:http://www.blogjava.net/baogenfly/articles/78557.html

 

这章的一个例子虽然简单,但是我觉的很有一定代表性。例子如下:

 

1:class Act {

2:   public static void doMathForever(int m) {

3:      int i = 0;

4:     int n=4>3?1:0;

5:        for (;;) {

6:           i += 1;

7:            i *= 2;

8:       }

9:    }

10:}

 

 

我用javap -verbose Act查看,代码如下:(红色为自己加上的注解)

Compiled from "Act.java"     

因为编译原文件不一定必须与java语言相关,可以使用其他语言来编写程序,然后将其编译为class文件,所以这里要写上Act.java而不是Act. 呵呵,想来以前为什么javac 来编译源文件时一定要加.java,而java 执行时就不需要加.java了,当时就是搞不懂,现在明白了。

class Act extends java.lang.Object

  SourceFile: "Act.java"

SourceFile属性,它提供了产生class文件的源文件的名称,它是一个可选的项,为什么说它是可选项的,因为class可以自己用UE等工具写。

  minor version: 0

  major version: 49

版本号:我用的是5.0的,出来的major version 是49,书上说1.0或1.2是45,1.4我想可能是48 吧。呵呵,还没有试过。

  Constant pool:

这个是常量池,刚看书的时候我还以为常量池放的一定是常量。错。

常量池就是该类型所用常量的一个有序集合,包括直接常量(String,integer,floating  point常量)和对其他类型、字段和方法的符号引用。

const #1 = Method #3.#12; //  java/lang/Object."<init>":()V

因为Constant pool#0是不用的,所以只能从#1开始,但不知为什么第一个是Method而不是class,我现在还不明白。

const #2 = class #13; //  Act

CONSTANT_Class是对一个类或接口的符号引用。这个是指向#13

const #3 = class #14; //  java/lang/Object

const #4 = Asciz <init>;

 这个Asciz应该表示是CONSTANT_Utf8吧,因为C ONSTANT_Utf8可以是存储四种基本信息类型:文字字符串、被定义的类和接口描述、对其他类或接口的符号引用以及属性相关的字符串。

<init>是实例的初始化方法,是实例调用方法前必须要<init>的,

<clinit>是类的初始化方法。

const #5 = Asciz ()V;

此<init>的描述符,()V表示<init>没有带参数,返回的是void型的。

书上介绍:

()I  int getSize()  

() Ljava/lang/String      String toString() 

const #6 = Asciz Code;

Code在所有不是抽象或者本地方法的method_info信息中,都存在一个Code_attribute表。

但是我试一下在抽象的方法中同样也有code的啊,不懂中。

const #7 = Asciz LineNumberTable;

LineNumberTable属性建立了方法字节码流偏移量和源代码行号之间的映射关系。关于这一点,我在下面详细谈到。

const #8 = Asciz doMathForever;

#8 字段名和方法名以简单名称出现在常量池的入口中,存的时候存简单名字,调用的时候要加 上全限定名

const #9 = Asciz (I)V;

doMathForover的描述符,参数是int类型,返回值是void类型

const #10 = Asciz SourceFile;

const #11 = Asciz Act.java;

const #12 = NameAndType #4:#5;//  "<init>":()V

NameAndType指向字段或者方法的符号引用的一部分。为什么没有指向#8,#9呢?不懂中。

const #13 = Asciz Act;

const #14 = Asciz java/lang/Object; 

#13,#14 CONSTANT_Utf8_info 表的入口,容纳了 类/接口全限定名等信息。用“/”代替“.”。在class文件的this_class字段是对常量池的一个引用,指向了常量池中CONSTANT_ClASS_info表,该表由两项组成,即标签和name_index。在这个例子里,this_class的值为2,也就是常量池里的第二项,这项标签是class,name_index是13,即指向常量池的第13项。第13项里就有当前类的全限定名。 

{

Act();

  Code:

   Stack=1, Locals=1, Args_size=1

需要的栈为1个,只是this的存取;本地变量为1个,也是this,方法的参数是1个,也是this传入。

   0: aload_0

从局部变量0中装载引用类型。

   1: invokespecial #1; //Method java/lang/Object."<init>":()V

调用Object的<init>方法,因为每个类都是继承Object,所以实例时都要调用Object的<init>方法。

   4: return

  LineNumberTable: 

   line 1: 0

 

public static void doMathForever(int);

  Code:

   Stack=2, Locals=3, Args_size=1

   0: iconst_0  将i 压入栈

   1: istore_1  放i

   2: iconst_1 同上

   3: istore_2

   4: iinc 1, 1  i++

  7   iload_1 从局部变量1中装载int类型值。

   8: iconst_2

   9: imul

   10: istore_1

   11: goto 4

  LineNumberTable: 

   line 3: 0  源代码第3行对应Code中的0偏移量。

   line 4: 2

   line 6: 4

   line 7: 7

   line 8: 11

 

}

分享到:
评论

相关推荐

    java.class文件反编译工具【免费】

    本资源提供的是一款名为JD-GUI的免费Java反编译工具,它可以帮助开发者将.class文件转换回易于理解的.java源代码格式。 JD-GUI是一款图形用户界面应用,设计简洁,使用方便。它允许用户直接打开.class文件,快速...

    java反编译工具(.class文件反编译成.java文件)

    Java反编译是将已编译的字节码(.class文件)转换回源代码(.java文件)的过程,这对于理解和学习已有的Java程序、逆向工程或调试都是很有用的。标题提到的"java反编译工具"是用于这个目的的软件,它能够帮助开发者...

    Java反编译工具把.class文件转换为.java文件

    ### Java反编译工具:将.class文件转换为.java文件 #### 概述 在软件开发领域,有时我们可能需要分析第三方库或者开源项目的内部结构,这时就需要借助于反编译工具来帮助我们阅读和理解其源码。Java作为一种广泛...

    java .class反编译成.java工具

    反编译工具可以将.class文件转换回.java源代码形式,以便开发者理解代码逻辑或进行代码分析。常用的Java反编译工具有jad、FernFlower、Cfr等,而jd-gui.exe是其中一种图形界面的反编译工具,它提供了一个直观的方式...

    JAVA.class文件的反编译插件

    这里我们关注的是一个名为"JAVA.class文件的反编译插件"的主题,它提供了一个高效、便捷且准确的方式来查看和理解这些二进制文件。 插件在软件开发中扮演着重要角色,它们通常是为特定应用程序或平台设计的附加组件...

    java反编译工具用于.class文件编译成.java文件

    Java反编译工具是开发者和逆向工程人员在处理Java字节码时的重要工具,它能够将已编译的.class文件转换回可读性强的.java源代码文件。这对于理解类库的功能、学习代码实现或者在丢失源代码的情况下进行调试都极其...

    .class文件反编译工具。 .class文件转java文件

    本文将围绕".class文件反编译工具"这一主题,详细讲解如何将`.class`文件转换为可读的`.java`源文件,并重点介绍解压后的jd-gui-windows-1.4.0工具的使用方法。 首先,了解`.class`文件结构至关重要。每个`.class`...

    java.class 反编译工具

    JD-GUI提供了一种直观的方式来查看和分析Java字节码,这对于调试、学习或逆向工程来说非常有用。 使用JD-GUI,用户可以选择打开一个JAR文件或单独的class文件,然后它会尝试反编译并显示源代码。虽然生成的代码可能...

    java.lang.UnsupportedClassVersionError Bad version number in .class file异常的解决办法

    这种错误通常发生在编译器版本与实际使用的JVM版本不匹配的情况下,比如使用了较新的Java编译器生成的`.class`文件在较旧的JVM上运行时就会触发此类异常。 #### 二、错误原因分析 该错误的主要原因是由于MyEclipse...

    java .class 类反编译软件

    Java编程语言以其跨平台、面向对象的特性深受开发者喜爱,但在某些情况下,我们可能需要将已编译的`.class`文件还原为可读的`.java`源代码,这就是所谓的反编译。在这种需求下,出现了专门用于反编译Java字节码的...

    java.class文件的反编译器

    Java的.class文件是Java字节码的载体,它是Java源代码经过编译后的结果。在没有源代码的情况下,想要理解或分析.class文件的功能,就需要借助反编译工具。本话题将深入探讨Java类文件的结构以及如何使用反编译器查看...

    反编译java.class文件

    JD-GUI是一款非常实用的Java反编译器,它允许开发者直接查看和分析.class文件的源代码形式。下面将详细介绍如何使用JD-GUI以及反编译的基本概念。 1. **反编译原理**: 反编译是将已编译的二进制代码转换回源代码...

    java源码查看器(查看.class文件源码)

    Java源码查看器是一款工具,它能够帮助开发者查看并理解`.class`文件的源代码,这类文件是由Java编译器将`.java`源代码编译后的产物。在默认情况下,`.class`文件并不包含原始的源代码,但通过反编译技术,我们可以...

    java反编译工具,能将.class文件转换成.java文件

    jd-gui是一个图形用户界面的应用程序,它允许开发者直接查看和分析Java类文件的源代码。这个工具不仅小巧,而且功能强大,能够100%地将.class文件还原为.java文件,尽管有时生成的源代码可能与原始的源代码略有不同...

    java反编译工具 对.class文件很有效

    总之,Java反编译工具提供了查看和理解字节码的能力,虽然不能完全恢复原始源代码,但它们对于理解和分析Java程序仍然非常有价值。正确使用这些工具,可以为开发、调试和学习带来便利。在实际操作中,务必注意法律和...

    JavaDecompiler打开class文件

    它允许用户查看并理解已编译的.class文件的内容,因为Java的源代码(.java文件)通常不会随可执行文件一起发布。`JavaDecompiler`这个标题暗示我们将探讨如何使用Java反编译器来打开和解析.class文件。 Java类文件是...

    .class文件反编译成java文件工具

    在Java编程语言中,.class文件是Java源代码编译后的二进制形式,它包含了机器可执行的字节码。然而,有时我们可能需要查看这些编译后的代码,以便理解或逆向工程一个已存在的Java应用。这就是`.class`文件反编译成`....

    myeclipse或者eclipse打开.class文件

    ### 使用MyEclipse或Eclipse打开.class文件的知识点详解 #### 一、概述 在进行Java开发时,经常需要查看编译后的`.class`文件内容。对于MyEclipse或Eclipse用户来说,可以通过安装特定插件来实现这一功能。本文将...

    Test.class文件

    ### 关于"Test.class文件"的知识点解析 #### 标题理解:Test.class文件 - **定义**:“Test.class”文件是指通过Java编译器(javac)将Java源代码文件(例如“Test.java”)编译后生成的字节码文件。 - **作用**:...

    Jdgui查看Java的.class文件的哦,很好用

    JDGUI是一款强大的Java反编译工具,专门用于查看和分析Java的.class文件。在软件开发过程中,有时我们可能需要查看Java字节码的源代码,尤其是在处理已编译的类或库时,JDGUI就显得尤为重要。它提供了一个直观的图形...

Global site tag (gtag.js) - Google Analytics