`
zhangwei_david
  • 浏览: 470098 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java Class文件学习

    博客分类:
  • Java
阅读更多

 

数据类型:

     

 

 

class 文件结构

  minor version:副版本

  major version:主版本号

文件的版本号 major_version.minor_version

flags:访问标志

  1. ACC_PUBLICH 声明为publich
  2. ACC_FINAL 声明为final
  3. ACC_SUPER 当用到invokespecial指令时,需要对父类方法做特殊处理
  4. ACC_INTERFACE 该class文件定义的是接口而不是类
  5. ACC_ABSTRACT  声明为abstract
  6. ACC_SYNTHETIC 声明为synthetic
  7. ACC_ANNOTATION 标识注解类型
  8. ACC_ENUM 标识枚举类型

constant pool 常量池

 

方法调用和返回指令

  1.   invokevirtual 指令用于调用对象的实例方法,根据对象的实际类型进行分派
  2. invokeinterface 指令用于调用接口方法,它会在运行时搜索由特定对象实现的这个接口方法,并找出适合的方法进行调用
  3. invokespecial 指令用于调用一些需要特殊的实例方法,包括实例的初始化,私有方法和父类方法
  4. invokestatic 指令用于调用命名类中的静态方法
  5. invokedynamic 指令用于调用可以绑定invokedynamic指令的调用点对象作为目标方法。

aaload_<n>:从局部变量表中加载索引值为n的引用

aconst_null:将一个null值压入到操作数栈顶

putfield:为制定类的字段赋值

 

 

 

 

 

通过执行javac  xxx.java   javap -verbose xxx.class 查看class文件

 

public class AconstNullDemo {
    Integer i=null;

    void test(){
        i=1;
        if(i.equals(Integer.valueOf(1))){
            System.out.println("eq");
        }
    }
}


public class common.jvm.AconstNullDemo
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #9.#20         // java/lang/Object."<init>":()V
   #2 = Fieldref           #8.#21         // common/jvm/AconstNullDemo.i:Ljava/lang/Integer;
   #3 = Methodref          #22.#23        // java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
   #4 = Methodref          #22.#24        // java/lang/Integer.equals:(Ljava/lang/Object;)Z
   #5 = Fieldref           #25.#26        // java/lang/System.out:Ljava/io/PrintStream;
   #6 = String             #27            // eq
   #7 = Methodref          #28.#29        // java/io/PrintStream.println:(Ljava/lang/String;)V
   #8 = Class              #30            // common/jvm/AconstNullDemo
   #9 = Class              #31            // java/lang/Object
  #10 = Utf8               i
  #11 = Utf8               Ljava/lang/Integer;
  #12 = Utf8               <init>
  #13 = Utf8               ()V
  #14 = Utf8               Code
  #15 = Utf8               LineNumberTable
  #16 = Utf8               test
  #17 = Utf8               StackMapTable
  #18 = Utf8               SourceFile
  #19 = Utf8               AconstNullDemo.java
  #20 = NameAndType        #12:#13        // "<init>":()V
  #21 = NameAndType        #10:#11        // i:Ljava/lang/Integer;
  #22 = Class              #32            // java/lang/Integer
  #23 = NameAndType        #33:#34        // valueOf:(I)Ljava/lang/Integer;
  #24 = NameAndType        #35:#36        // equals:(Ljava/lang/Object;)Z
  #25 = Class              #37            // java/lang/System
  #26 = NameAndType        #38:#39        // out:Ljava/io/PrintStream;
  #27 = Utf8               eq
  #28 = Class              #40            // java/io/PrintStream
  #29 = NameAndType        #41:#42        // println:(Ljava/lang/String;)V
  #30 = Utf8               common/jvm/AconstNullDemo
  #31 = Utf8               java/lang/Object
  #32 = Utf8               java/lang/Integer
  #33 = Utf8               valueOf
  #34 = Utf8               (I)Ljava/lang/Integer;
  #35 = Utf8               equals
  #36 = Utf8               (Ljava/lang/Object;)Z
  #37 = Utf8               java/lang/System
  #38 = Utf8               out
  #39 = Utf8               Ljava/io/PrintStream;
  #40 = Utf8               java/io/PrintStream
  #41 = Utf8               println
  #42 = Utf8               (Ljava/lang/String;)V
{
  java.lang.Integer i;
    descriptor: Ljava/lang/Integer;
    flags:

  public common.jvm.AconstNullDemo();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: aload_0
         //将null压入栈顶
         5: aconst_null
         //将null赋值给属性i
         6: putfield      #2                  // Field i:Ljava/lang/Integer;
         9: return
      LineNumberTable:
        line 6: 0
        line 7: 4

  void test();
    descriptor: ()V
    flags:
    Code:
      stack=2, locals=1, args_size=1
        //加载this到操作栈
         0: aload_0  
         //加载常量1到操作栈
         1: iconst_1
         //调用静态方法
         2: invokestatic  #3                  // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
         //将计算结果赋值给属性,为什么putfield的索引不是连续的?这是因为invokestatic操作和操作数长度为3个slot
         5: putfield      #2                  // Field i:Ljava/lang/Integer;
         //加载this到操作栈
         8: aload_0
         //将属性压入栈顶
         9: getfield      #2                  // Field i:Ljava/lang/Integer;
        //加载常量1到操作栈顶
        12: iconst_1
        //调用静态方法Integer.valueOf()
        13: invokestatic  #3                  // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
        //调用虚方法equals
        16: invokevirtual #4                  // Method java/lang/Integer.equals:(Ljava/lang/Object;)Z
        //如果ifeq的结果为0则挑战到30行
        19: ifeq          30
        22: getstatic     #5                  // Field java/lang/System.out:Ljava/io/PrintStream;
        25: ldc           #6                  // String eq
        27: invokevirtual #7                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
        30: return
      LineNumberTable:
        line 10: 0
        line 11: 8
        line 12: 22
        line 14: 30
      StackMapTable: number_of_entries = 1
        frame_type = 30 /* same */
}

 

  • 大小: 441.2 KB
  • 大小: 407.9 KB
0
1
分享到:
评论

相关推荐

    java源码反编译/.class文件转.java文件

    有时候,为了学习源码,我们希望将.java已经编译成.class的文件反编译为.java文件,如何还原为.java文件呢? 此款软件可以帮您将.class文件反编译为.java文件。 —好不好? ——谁用谁知道!

    ClassFinal是一款java class文件安全加密工具。.zip

    ClassFinal是一款java class文件安全加密工具,支持直接加密jar包或war包,无需修改任何项目代码,兼容spring-framework;可避免源码泄漏或字节码被反编译。.zip 软件开发设计:应用软件开发、系统软件开发、移动...

    java反编译工具,class文件 反编译成代码

    java反编译工具,class文件 反编译成代码,学习java必备

    java class文件格式学习笔记1

    * 主要用于存储以下内容: * 1、字面量,包括文本字符串、被申明为final类型的常量等 * 2、符号引用:类或是接口的全限定名称、方法以及字段的名称及描述符

    java反编译工具,由于.class 文件的翻译

    java 的反编译器,可以方便的查看.class的源码,有助于java的学习。

    Learn Java File By Hello World Example

    这个文档通过阅读、分析和翻译二进制格式的Java Class文件学习Java Class的技术。

    Java文件结构解析工具

    一个简单的分析工具,用于分析”.class/.cap/.exp”格式的Java文件。 对于CAP文件,支持version 2.1 and 2.2. 适用于JCVM的学习。 使用工具时,需保证“C:\Program Files\WinZip\WINZIP32.EXE”存在,用于解压CAP...

    java文件反编译器(支持.class文件)

    支持java文件的反编译,轻松拿到开发代码,是学习利器和办公良品!

    IntelliJ IDEA右键文件夹没有Java Class文件的原因及解决方法

    主要介绍了IntelliJ IDEA右键文件夹没有Java Class文件的原因及解决方法,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

    java jdk8 学习笔记

    Java编译语言将Java代码编译成.class文件(只有一种形式),而C/C++语言将代码编译成01码,不同的操作系统的01码指令不同,这造成了不能跨平台,而Java将这个任务交给JVM,不同操作系统上的JVM将.class文件编译成不同...

    class文件分析

    Android逆向-java,dex文件分析软件,是为了学习class文件的时候进行辅助的一个脚本,希望可以帮助到一些学习java的人。

    Java的 Class(类)文件结构详解

    了解Class文件的结构组成,对于我们后续的JVM以及Java原理深入学习是很有帮助的,因为Class文件帮我们默默的做了很多事,比如、为什么对象方法中可以直接使用this变量?!本文将带领大家,一步步,从开头到结尾,...

    class 文件 java 基础

    java 基础 在网上找到的一个java学习者的方法,看了也许会有用的吧

    Java学习代码实例 JAVA基础,JAVA面向对象,JAVA高级.rar

    JAVA命令-&gt;要使用一个*.class文件(类文件)-&gt;通过classpath找到*.class文件所保存的真实目录,之后再进行加载执行 小结 Path的主要功能是设置JDK的可执行命令 classpath主要是在执行时候起作用,告诉JVM类的保存路径...

    java反编译器,反编译class文件

    反编译class文件,很实用的小工具,在eclipse中直接反编译class文件,有助于源码学习

    JAVA反编译工具(反编译java的class文件)

    可以反编译CLASS查看JAVA源码! 是一个很好学习JAVA的工具! 大家下载吧!

    Java IO学习文件处理

    public class FileFormatChange { /** * 1、创建输入(输出)流对象 * 2、读(写)数据 * 3、关闭输入输出流 */ public static void main(String[] args) { // TODO Auto-generated method stub ...

    Java如何修改.class文件变量

    主要介绍了Java如何修改.class文件变量,帮助大家更好的理解和学习Java,感兴趣的朋友可以了解下

    java源码包---java 源码 大量 实例

     Java编写的网页版魔方游戏,编译后生成.class文件,然后用HTML去调用,不过运行时候需要你的浏览器安装有运行Class的插件。Java源代码实现部分,比较有意思,也具参考性。像坐标控制、旋转矩阵、定时器、生成图像...

    java学习心得

    4. 在一个*.Java的文件中,只能有一个public class 的声明,但是允许有多个class的声明。 5. 数据的溢出:任何一种数据都有其最大的取值:如果已经是最大的值,则加1会变成最小值,如果是最小减1会变成最大值。

Global site tag (gtag.js) - Google Analytics