没有合适的资源?快使用搜索试试~ 我知道了~
JVM规范中定义了class文件的格式,JDK在编译java源码时,使用了javac,javac编译的步骤: 1. 分析和输入到符号表(Parse And Enter) Parse做的是词法和语法的分析。 词法分析:将代码字符串转变为token序列 语法分析:将根据语法由token序列生成抽象语法树 Enter将符号输入到符号表,通常包括确定类的超类和接口,添加默认构造器等。 2. 注解处理 3. 语义分析和生成class文件
资源推荐
资源详情
资源评论
JVM 的机制学习
大纲
JVM 标准结构
Java 代码执行机制
源码编译机制
JVM 规范中定义了 class 文件的格式,JDK 在编译 java 源码时,使用了 javac,javac 编译的
步骤:
1. 分析和输入到符号表(Parse And Enter)
Parse 做的是词法和语法的分析。
词法分析:将代码字符串转变为 token 序列
语法分析:将根据语法由 token 序列生成抽象语法树
Enter 将符号输入到符号表,通常包括确定类的超类和接口,添加默认构造器等。
2. 注解处理
3. 语义分析和生成 class 文件
通常生成 class 文件不知包括字节码,一般包括
结构信息,元数据,方法信息。
下面是一个例子:
Compiled from "Foo.java"
//类/继承的超类/实现的接口的声明信息
public class Foo extends java.lang.Object
SourceFile: "Foo.java"
//class 文件格式版本号,major version 50 表示 jdk 6, 49 为 jdk 5 只有高版本能执行低版本
的 class 文件
minor version: 0
major version: 50
//常量池,存放了所有的 Field 名称,方法名,方法签名,类型名,代码及 class 文件中的常
量值
Constant pool:
const #1 = Method #7.#27; // java/lang/Object."<init>":()V
const #2 = Field #6.#28; // Foo.count:I
const #3 = class #29; // java/lang/Exception
const #4 = String #30; // count overflow
const #5 = Method #3.#31; // java/lang/Exception."<init>":(Ljava/lang/Str
ing;)V
const #6 = class #32; // Foo
const #7 = class #33; // java/lang/Object
const #8 = Asciz MAX_COUNT;
const #9 = Asciz I;
const #10 = Asciz ConstantValue;
const #11 = int 1000;
const #12 = Asciz count;
const #13 = Asciz <init>;
const #14 = Asciz ()V;
const #15 = Asciz Code;
const #16 = Asciz LineNumberTable;
const #17 = Asciz LocalVariableTable;
const #18 = Asciz this;
const #19 = Asciz LFoo;;
const #20 = Asciz bar;
const #21 = Asciz ()I;
const #22 = Asciz StackMapTable;
const #23 = Asciz Exceptions;
const #24 = Asciz <clinit>;
const #25 = Asciz SourceFile;
const #26 = Asciz Foo.java;
const #27 = NameAndType #13:#14;// "<init>":()V
const #28 = NameAndType #12:#9;// count:I
const #29 = Asciz java/lang/Exception;
const #30 = Asciz count overflow;
const #31 = NameAndType #13:#34;// "<init>":(Ljava/lang/String;)V
const #32 = Asciz Foo;
const #33 = Asciz java/lang/Object;
const #34 = Asciz (Ljava/lang/String;)V;
{
//将符号输入到符号表时生成的默认构造器方法
public Foo();
Signature: ()V
LineNumberTable:
line 1: 0
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this LFoo;
Code:
Stack=1, Locals=1, Args_size=1
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
LineNumberTable:
line 1: 0
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this LFoo;
//bar 方法的元数据信息
public int bar() throws java.lang.Exception;
Signature: ()I
//对应字节码的源码行号信息,可在编译的时候通过 -g:none 去掉行号信息,行号信息对于
查找问题而言至关重要,因此最好保留
LineNumberTable:
line 5: 0
line 6: 15
line 7: 19
line 9: 29
//局部变量信息,如生成的 class 文件中无局部变量信息,则无法知道局部变量的名称,并
且局部变量信息是和方法绑定的,接口是没有方法体的,所以 ASM 之类的在获取接口方
法时,是拿不到方法中参数的信息的
LocalVariableTable:
Start Length Slot Name Signature
0 33 0 this LFoo;
Code:
Stack=3, Locals=1, Args_size=1
//对应方法的字节码
0: getstatic #2; //Field count:I
3: iconst_1
4: iadd
5: dup
6: putstatic #2; //Field count:I
9: sipush 1000
12: if_icmplt 29
15: iconst_0
16: putstatic #2; //Field count:I
19: new #3; //class java/lang/Exception
22: dup
23: ldc #4; //String count overflow
25: invokespecial #5; //Method java/lang/Exception."<init>":(Ljava/lang/St
ring;)V
28: athrow
29: getstatic #2; //Field count:I
32: ireturn
LineNumberTable:
line 5: 0
line 6: 15
line 7: 19
line 9: 29
LocalVariableTable:
Start Length Slot Name Signature
0 33 0 this LFoo;
//记录有分支的情况(对应代码中的 if…for,while 等)
StackMapTable: number_of_entries = 1
frame_type = 29 /* same */
//异常处理表
Exceptions:
throws java.lang.Exception
static {};
Signature: ()V
LineNumberTable:
line 3: 0
Code:
Stack=1, Locals=0, Args_size=0
0: iconst_0
1: putstatic #2; //Field count:I
4: return
LineNumberTable:
剩余25页未读,继续阅读
资源评论
hongtang81
- 粉丝: 0
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于python编写的Keras深度学习框架开发,利用卷积神经网络CNN,快速识别图片并进行分类
- 最全空间计量实证方法(空间杜宾模型和检验以及结果解释文档).txt
- 5uonly.apk
- 蓝桥杯Python组的历年真题
- 2023-04-06-项目笔记 - 第一百十九阶段 - 4.4.2.117全局变量的作用域-117 -2024.04.30
- 2023-04-06-项目笔记 - 第一百十九阶段 - 4.4.2.117全局变量的作用域-117 -2024.04.30
- 前端开发技术实验报告:内含4四实验&实验报告
- Highlight Plus v20.0.1
- 林周瑜-论文.docx
- 基于MIC+NE555光敏电阻的声光控电路Multisim仿真原理图
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功