跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 关于 Java 字节码的请教
未分類
2020 年 5 月 20 日

关于 Java 字节码的请教

关于 Java 字节码的请教

資深大佬 : lqw3030 21

  • 例如,我有这么一份代码
package lock;  public class ByteCodeTest {     private volatile String name="view";     public void work(){         name+="hello";     } } 
  • 编译后,通过字节码工具查看
// class version 56.0 (56) // access flags 0x21 public class lock/ByteCodeTest {    // compiled from: ByteCodeTest.java   // access flags 0x19   public final static INNERCLASS java/lang/invoke/MethodHandles$Lookup java/lang/invoke/MethodHandles Lookup    // access flags 0x42   private volatile Ljava/lang/String; name    // access flags 0x1   public <init>()V    L0     LINENUMBER 3 L0     ALOAD 0     INVOKESPECIAL java/lang/Object.<init> ()V    L1     LINENUMBER 4 L1     ALOAD 0     LDC "view"     PUTFIELD lock/ByteCodeTest.name : Ljava/lang/String;     RETURN    L2     LOCALVARIABLE this Llock/ByteCodeTest; L0 L2 0     MAXSTACK = 2     MAXLOCALS = 1    // access flags 0x1   public work()V    L0     LINENUMBER 6 L0     ALOAD 0     DUP     GETFIELD lock/ByteCodeTest.name : Ljava/lang/String;     INVOKEDYNAMIC makeConcatWithConstants(Ljava/lang/String;)Ljava/lang/String; [       // handle kind 0x6 : INVOKESTATIC       java/lang/invoke/StringConcatFactory.makeConcatWithConstants(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;       // arguments:       "u0001hello"     ]     PUTFIELD lock/ByteCodeTest.name : Ljava/lang/String;    L1     LINENUMBER 7 L1     RETURN    L2     LOCALVARIABLE this Llock/ByteCodeTest; L0 L2 0     MAXSTACK = 2     MAXLOCALS = 1 } 
  • 想请教下如何阅读上述指令语法
  • 或是 google 什么关键字可以搜到相关内容
大佬有話說 (11)

  • 資深大佬 : anerinck

    我觉得直接看字节码的十六进制比阅读反编译要清楚。。如果是要了解指令的话不如去搜索一下 jvm 的指令集一类的?

  • 資深大佬 : misaka19000

    《深入理解 Java 虚拟机》第 6 章

  • 資深大佬 : CRUD

    Java 虚拟机指令集: https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html

  • 資深大佬 : guxingke

    https://github.com/guxingke/mini-jvm

    java 实现的解释字节码的虚拟机 可以了解一下

  • 主 資深大佬 : lqw3030

    @anerinck
    @misaka19000
    @CRUD
    @guxingke
    太棒了,感谢各位

  • 資深大佬 : maokabc

    java 虚拟机规范,或者可以看 jasmin 的语法,感觉比这个更好理解,还能修改了再编译回 class

  • 資深大佬 : choiwanxy

    首先你要分得清哪里是什么,比如哪里是常量池,哪里是无参构架函数,哪里是方法对应的字节码。找到你要看的方法,看 jvm 指令,一个个去查是什么意思。

  • 資深大佬 : itning

    不要脸一下
    https://blog.itning.top/post/2020/04/10/jvm%E7%B3%BB%E5%88%972-class%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F/

  • 主 資深大佬 : lqw3030

    @maokabc
    @choiwanxy
    @itning
    有认真去看,感谢哈

  • 資深大佬 : CFM880

    jclasslib idea 插件,常量池,方法区,点击指令可以跳转到#3 说的网页中的指定指令
    关于 Java 字节码的请教

  • 資深大佬 : CFM880

    https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html
    这一章介绍了 ClassFile Structure,先整体了解字节码文件结构,结构嵌套结构,后面再到方法区的指令,比较容易一些,直接上指令集,可以按照字节码文件结构规定的字节来分析一下
    ClassFile {
    u4 magic; #u4 4 个字节魔数
    u2 minor_version; #2 个字节小版本号
    u2 major_version;
    u2 constant_pool_count;
    cp_info constant_pool[constant_pool_count-1];
    u2 access_flags;
    u2 this_class;
    u2 super_class;
    u2 interfaces_count;
    u2 interfaces[interfaces_count];
    u2 fields_count;
    field_info fields[fields_count];
    u2 methods_count;
    method_info methods[methods_count];
    u2 attributes_count;
    attribute_info attributes[attributes_count];
    }

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具