jvm 字节码学习(1)
是不是只有java编译器才可以将java转为class 字节码文件?
不是的,jRuby/Groovy/Scala/Jython 都是可以编译成字节码文件的。计算机是以010101的方式执行的。
什么是u1,u2,u4,u8
u1: 一个字节;
u2: 二个字节;
u4: 4个字节;
u8:8个字节;字节码的具体解释
第一个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.分析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)