字节码文件的分析

//环境的搭建:

1.创建一个类并编译它

2.使用java命令:javap -c -verbose build/classes/java/main/com/yang/jvm/Test.class 将16进制的字节码文件转成可视化的文件内容如下:

具体内容如下:

Classfile /F:/jvmdemo/build/classes/java/main/com/yang/jvm/Test.class
  Last modified 2019-10-17; size 573 bytes
  MD5 checksum f85b42e59f656b2cae810d27e91ccd7d
  Compiled from "Test.java"
public class com.yang.jvm.Test
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #6.#25         // java/lang/Object."<init>":()V
   #2 = Fieldref           #5.#26         // com/yang/jvm/Test.i:I
   #3 = String             #27            // hello
   #4 = Fieldref           #5.#28         // com/yang/jvm/Test.str:Ljava/lang/String;
   #5 = Class              #29            // com/yang/jvm/Test
   #6 = Class              #30            // java/lang/Object
   #7 = Utf8               i
   #8 = Utf8               I
   #9 = Utf8               str
  #10 = Utf8               Ljava/lang/String;
  #11 = Utf8               <init>
  #12 = Utf8               ()V
  #13 = Utf8               Code
  #14 = Utf8               LineNumberTable
  #15 = Utf8               LocalVariableTable
  #16 = Utf8               this
  #17 = Utf8               Lcom/yang/jvm/Test;
  #18 = Utf8               getI
  #19 = Utf8               ()I
  #20 = Utf8               setI
  #21 = Utf8               (I)V
  #22 = Utf8               <clinit>
  #23 = Utf8               SourceFile
  #24 = Utf8               Test.java
  #25 = NameAndType        #11:#12        // "<init>":()V
  #26 = NameAndType        #7:#8          // i:I
  #27 = Utf8               hello
  #28 = NameAndType        #9:#10         // str:Ljava/lang/String;
  #29 = Utf8               com/yang/jvm/Test
  #30 = Utf8               java/lang/Object
{
  public com.yang.jvm.Test();
    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
         5: iconst_5
         6: putfield      #2                  // Field i:I
         9: return
      LineNumberTable:
        line 3: 0
        line 4: 4
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      10     0  this   Lcom/yang/jvm/Test;

  public int getI();
    descriptor: ()I
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: getfield      #2                  // Field i:I
         4: ireturn
      LineNumberTable:
        line 9: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       5     0  this   Lcom/yang/jvm/Test;

  public void setI(int);
    descriptor: (I)V
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=2, args_size=2
         0: aload_0
         1: iload_1
         2: putfield      #2                  // Field i:I
         5: return
      LineNumberTable:
        line 13: 0
        line 14: 5
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       6     0  this   Lcom/yang/jvm/Test;
            0       6     1     i   I

  static {};
    descriptor: ()V
    flags: ACC_STATIC
    Code:
      stack=1, locals=0, args_size=0
         0: ldc           #3                  // String hello
         2: putstatic     #4                  // Field str:Ljava/lang/String;
         5: return
      LineNumberTable:
        line 6: 0
}
SourceFile: "Test.java"

此外:idea也有插件可以得到上面的字节码内容,安装插件jclasslib:使用该插件的好处是,对应的指令如aload_0可以点击,链接到oracle官网进行解释

安装重启后,鼠标点击在对应的java文件上,不是class文件,如Test.java文件,然后点击view菜单如图:

在右边可以看到:

  

原文地址:https://www.cnblogs.com/yangxiaohui227/p/11690956.html

时间: 2024-10-11 13:58:21

字节码文件的分析的相关文章

字节码文件初探

程序员编写的Java源文件(.java)经过编译,生成字节码文件(.class). Java程序的运行需要JVM(Java虚拟机,Java Virtual Machines)支持.JVM是一个软件,安装在操作系统中,为字节码文件提供运行环境. Java官方提供了针对不同平台的JVM软件(比如JVM  for Linux, JVM for Windows等),只要是标准的字节码文件,就可以在不同的JVM上运行且运行效果相同,这就是一次编程到处使用(也是Java程序的一个明显优点). 而其它语言,如

JAVA字节码文件之第二篇(常量池)

一.常量池的内容 一个java类中定义的很多信息都是由常量池来维护和描述的,可以将常量池看作是class文件的资源仓库,比如java类中定义的方法与变量信息.常量池中主要存储两类常量:字面量(文本字符串,final的常量)与符号引用(类和接口的全限定名,字段的名称和描述符,方法的名称和描述符 一.常量池的结构 二.常量池的分析 常量池(也称常量表):主版本号之后就是常量池的开始位置:java类所对应的常量池主要由常量池数量和常量池数组两部分组成,常量池数量是主版本号之后的两个字节:常量池数组在常

java中三种方式获得类的字节码文件对象

package get_class_method; public class ReflectDemo { /** * @param args */ public static void main(String[] args) { getClassObject1(); getClassObject2(); getClassObject3(); } public static void getClassObject1(){ Person p = new Person(); System.out.pr

java 字节码文件详解

每一个class字节码文件都唯一对应一个类或接口,class文件中记录中类或接口的基本信息,但反之不成立,不是每一个类或接口都有一个唯一对应的字节码文件,首先类或接口的字节码可以不以文件的方式存储,可以直接从内存中生成字节码,而不产生.class文件,动态代理的原理就是直接内存中生成字节码流,根据加载字节码流进行类加载操作,类实例化,生成代理对象. 字节码文件记录的信息:魔术,class文件主次版本,常量池数量及常量池表,类或接口的访问标志,类索引,超类索引,接口数量及接口表,字段数量及字段表,

Android-Java-synchronized静态方法&amp;字节码文件对象

上一篇博客 Android-Java-同步方法-synchronized,中讲解了普通方法加入synchronized修饰符,此synchronized的同步锁是this,还介绍方法的封装性,这篇博客就不讲方法的封装性了 先看一个 静态方法加入修饰符synchronized(案例) package android.java.thread12; /** * 售票业务 */ class Booking { /** * 模拟票的总算 10张票 */ private static int ticket

java中反射机制通过字节码文件对象获取字段和函数的方法

pclass = Class.forName("get_class_method.Person"); //Field ageField = pclass.getField("age");//因为age成员变量是私有的,所以会产生NoSuchFieldException异常 Field ageField = pclass.getDeclaredField("age");//获得该对象反映此 Class 对象所表示的类或接口的指定已声明字段 Obje

【java】查看Java字节码文件内容的方法+使用javap找不到类 解决方法

研究synchronized底层实现,涉及到查看java字节码的需要 前提是,你的PC已经成功安装了JDK并别配置了环境变量. ==========查看方法========= 一.javap查看简约字节码方式 1.准备一个java文件 例如,文件所在目录在此处 Student.java文件内容如下: package com.sxd.sweeping.test.synchron; public class Student implements Runnable{ static int age; p

如何将源码文件编译成字节码文件

[[email protected] ~]# cat 1.py # 要编译的源码文件 #!/usr/bin/python print 'Hello World' [[email protected] ~]# cat 2.py # 将 1.py 编译成字节代码 #!/usr/bin/python import py_compile py_compile.compile('1.py') [[email protected] ~]# python 2.py [[email protected] ~]#

[C/C++] 各种C/C++编译器对UTF-8源码文件的兼容性测试(VC、GCC、BCB)

在不同平台上开发C/C++程序时,为了避免源码文件乱码,得采用UTF-8编码来存储源码文件.但是很多编译器对UTF-8源码文件兼容性不佳,于是我做了一些测试,分析了最佳保存方案. 一.测试程序 为了测试编译器对UTF-8源码文件兼容性,我编写了这样的一个测试程序—— //#if _MSC_VER >= 1600 // VC2010 //#pragma execution_character_set("utf-8") //#endif #include <stdio.h>