jvm 字节码学习(1)

  1. 是不是只有java编译器才可以将java转为class 字节码文件?
    不是的,jRuby/Groovy/Scala/Jython 都是可以编译成字节码文件的。

  2. 计算机是以010101的方式执行的。

  3. 什么是u1,u2,u4,u8
    u1: 一个字节;
    u2: 二个字节;
    u4: 4个字节;
    u8:8个字节;

  4. 字节码的具体解释
    第一个u4 字节代表的是一个class 文件:cafe babe (固定的)
    第二个u4 字节JDK 编译的版本号:jdk7->51,jdk8->52

    无符号数:就是数值;
    表: 就是一个结构,类似于一个结构:

    xxx_info{
    }

    字面量: int m=3(字面量就是=号右边的东西)
    符号引用:包含三类常量:1.类和接口的全限定名;2. 字段的名称和描述符;3. 方法的名称和描述符
    init和clinit:
    init:实例化初始化方法。调用new 初始化对象的时候;2. 调用反射的时候newInstance();3. 调用clone方法的时候;4.ObjectInputstream.getObject()调用。
    clinit: 类和接口的初始化.所有的类变量初始化语句和静态初始化语句都被java 编译器搜集在一起,放到clinit.

  5. 分析class文件:使用javap -v Test.class
    invokespecial #1
    第一步:到常量池里面找到#1常量(#1:MethodRef #4,#22)
    #4: 指向Class_info的索引项(u2类型数据)
    #22:指向的就是NameAndType的索引项(u2类型数据)
    第二步: 找#4号常量(#4 号常量是Class: java/lang/Thread)
    第三步:找#22 号常量(#7:#8)
    第四步:NameAndType的数据结构(u2:名称常量的索引,u2:描述符常量项的索引)
    第五步:#7 对应的
    第六步:#8 对应()V
    搜索的结果:V java/lang/Thread.()
    类的元数据:描述类的数据
    问题3:类名应该多长?
    不能超过256
    访问控制标志:0X0001|0X0020 = 0X0021 ==> 00 21 (0X0001为public ,0x0020是固定的,故0x0021就是public)
    类索引,父类索引,接口计数器
    00 03 00 04 00 02
    00 03:代表3#常量索引:com.icil.class.Test
    00 04:代表4#常量索引:java/lang/Thread
    00 02:代表有几个接口,当前是2个,(Serializable,Comparable)

相关推荐