看了下《深入虚拟机》相关章节,还是存在一些字节码的疑惑

2020-04-21 21:50:27 +08:00
 lqw3030
package core.object_create;

public class ObjectTest {
    private String name="v2";

    public void hi(){
        int i =777;
    }
}

// class version 56.0 (56)
// access flags 0x21
public class core/object_create/ObjectTest {

  // compiled from: ObjectTest.java

  // access flags 0x2
  private 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 "v2"
    PUTFIELD core/object_create/ObjectTest.name : Ljava/lang/String;
    RETURN
   L2
    LOCALVARIABLE this Lcore/object_create/ObjectTest; L0 L2 0
    MAXSTACK = 2
    MAXLOCALS = 1

  // access flags 0x1
  public hi()V
   L0
    LINENUMBER 7 L0
    SIPUSH 777
    ISTORE 1
   L1
    LINENUMBER 8 L1
    RETURN
   L2
    LOCALVARIABLE this Lcore/object_create/ObjectTest; L0 L2 0   //这句
    LOCALVARIABLE i I L1 L2 1 //以及这句分别在申明什么
    MAXSTACK = 1
    MAXLOCALS = 2
}

2029 次点击
所在节点    Java
2 条回复
penguinWWY
2020-04-22 00:43:12 +08:00
你用的字节码查看工具把 LineNumberTable 和 LocalVariableTable 这两个表的内容解析了一下
L0 、L1 应该表示一个 label,也就是一个标签
`LINENUMBER ` 声明这个标签对应的行号
`LOCALVARIABLE` 表示局部变量的名字、类型
lqw3030
2020-04-22 15:50:00 +08:00
@penguinWWY 感谢

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

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

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

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

© 2021 V2EX