关于 Java 字节码的请教

2020-04-14 09:45:48 +08:00
 lqw3030
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
}
2986 次点击
所在节点    Java
11 条回复
anerinck
2020-04-14 09:52:50 +08:00
我觉得直接看字节码的十六进制比阅读反编译要清楚。。如果是要了解指令的话不如去搜索一下 jvm 的指令集一类的?
misaka19000
2020-04-14 09:53:04 +08:00
《深入理解 Java 虚拟机》第 6 章
CRUD
2020-04-14 09:54:15 +08:00
guxingke
2020-04-14 10:15:11 +08:00
https://github.com/guxingke/mini-jvm

java 实现的解释字节码的虚拟机 可以了解一下
lqw3030
2020-04-14 10:23:16 +08:00
@anerinck
@misaka19000
@CRUD
@guxingke
太棒了,感谢各位😄
maokabc
2020-04-14 10:27:21 +08:00
java 虚拟机规范,或者可以看 jasmin 的语法,感觉比这个更好理解,还能修改了再编译回 class
choiwanxy
2020-04-14 10:34:45 +08:00
首先你要分得清哪里是什么,比如哪里是常量池,哪里是无参构架函数,哪里是方法对应的字节码。找到你要看的方法,看 jvm 指令,一个个去查是什么意思。
itning
2020-04-14 12:16:23 +08:00
lqw3030
2020-04-14 12:23:01 +08:00
@maokabc
@choiwanxy
@itning
有认真去看,感谢哈😄
CFM880
2020-04-14 13:09:45 +08:00
jclasslib idea 插件,常量池,方法区,点击指令可以跳转到#3 楼说的网页中的指定指令
CFM880
2020-04-14 13:23:23 +08:00
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];
}

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/662185

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX