Class文件的结构其实也很简单,主要可通过下面的数据结构表示
ClassFile {
u4 magic;
u2 minor_version;
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];
}
每个java源代码都会生成对应的class文件,文件中最重要的当属constant_pool了,不过首先还是说一下描述符。
A 描述符
Java源代码中有方法、类、域(即成员变量或类变量)几种,这些在Class文件中都有对应的描述符进行描述。例如:
Object method(int i,double d,Thread t)
对应的描述符为:
(IDLjava/lang/Thread;)LJava/Object
格式为(参数描述符*)返回描述符,可以看到函数名称在其中并没有出现。
B 常量池
有了描述符就可以在常量池中对它进行索引了。例如在常量池中包含一种数据结构:
CONSTANT_NameAndType_info {
u1 tag;
u2 name_index;
u2 descriptor_index;
}
用于描述域和方法的
其中descriptor_index会索引到一个Constant_Utf8的字符串,这个字符串可能就是前面所说的"(IDLjava/lang/Thread;)LJava/Object"
其中name_index会索引到一个Constant_Utf8的字符串,它是这个方法或域的不完整限定名。(Thread类的完整限定名是 java.lang.Thread, 不完整限定名是Thread)
C 属性
一些的关注还需要放在attributes上,因为这个数据结构中包含了将要被执行的JVM指令代码,attributes的数据结构如下:
attribute_info {
u2 attribute_name_index;
u4 attribute_length;
u1 info[attribute_length];
}
这只是一个可变的结构,对于code来说,它能演化为:
Code_attribute {
u2 attribute_name_index;
u4 attribute_length;
u2 max_stack;
u2 max_locals;
u4 code_length;
u1 code[code_length];
u2 exception_table_length;
{ u2 start_pc;
u2 end_pc;
u2 handler_pc;
u2 catch_type;
} exception_table[exception_table_length];
u2 attributes_count;
attribute_info attributes[attributes_count];
}
我们关心的code就放在code的数组中,另外我们看到了一些关于exception的信息,还有最后居然还又嵌入了attributes信息,这些信息可能是LineNumberTable或LocalVariableTable ,这些都是我们可能想知道的一些调试信息,需要在编译时加上"-g"选项。
知道了Class文件的格式就可以使用JVM加载它,并进行校验,准备和解析了,并加载运行指令
分享到:
相关推荐
总共110讲,非常适合jvm初学者,希望对大家有所帮助,奋斗吧少年
JVM监控工具使用入门,对初学这帮助很大
整理好了JVM虚拟机的原理,适合初学者理论,也适合找工作面试的。内附运行图,思维导图,文字详解,并有相关算法的详解的方式供大家理解,请大家多多支持!
eta, 在JVM上,Eta编程语言,Haskell的方言 - 在JVM上的现代 Haskell Eta编程语言是在JVM上运行的Haskell方言,具有以下目标:命令式语言的初学者,特别是Java的辅助功能GHC 7.10.3 Haskell的兼容性。访问 eta
初学者想要对jvm垃圾回收有比较全的了解和认识,这个PPT正是你所需要的,希望对你有用,也感谢原资源分享者!
java初学者了解jvm相关知识增强
适合初学JVM优化,有一些基础的指令,还有视图工具方便查看jvm堆内存的使用 还有简单死锁的案例
全网最全的JVM思维导图,总体分基础、进阶、底层,包含工具,内有实战案例,适合初学者到P7技术专家。
Java集合、JVM面试题,包括Java集合、JVM内存模型、垃圾回收机制、JVM调优、异常处理等相关面试题 ...适用于Java编程的初学者,加强自身对于Java集合、JVM、异常处理等方面的知识储备,更好的应对面试机会
Cucumber-jvm-教程这是一个初学者使用cucumber-jvm学习行为驱动开发(BDD)的教程。 本教程包括以下步骤我们首先浏览一个骨架 Eclipse 项目。 我们使用 XMind 的思维导图技术探索需求。 然后我们将需求从 XMind 导出...
深入JVM内核—原理、诊断、优化视频教程 总共11集 适合初学者入门
初学JAVA很容易被其中的很多概念弄的傻傻分不清楚,首先从概念上理解一下吧,JDK(Java Development Kit)简单理解是Java开发工具包,JRE(Java Runtime Enviroment)是Java的运行环境,JVM( java virtual machine)也...
Java编译的单位换算器,无需JVM,可以直接安装 这个是rar part2,part1在我的资源里面找(。。没有办法啦~每次只能上传20MB) 该软件我觉得是解决了很会初学Java的人的问题,例如图片应该如何载入在别的机子上运行...
此文对于java初学者,想了解清楚java内存结构的童鞋,很有参考价值
java开发基本知识点整理,面试常用问题整理,WEB 前端基础,HTTP 状态消息,抽象类和接口,面向对象编程的原则,封装,继承和多态,字节流与字符流的区别,垃圾回收的优点和原理,什么是线程安全,同步和异步有什么...
Java编译的单位换算器,无需JVM,可以直接安装 这个是rar part1,part2在我的资源里面找(。。没有办法啦~每次只能上传20MB) 该软件我觉得是解决了很会初学Java的人的问题,例如图片应该如何载入在别的机子上运行...
主要介绍了java环境中的JDK、JVM、JRE详细介绍的相关资料,对于初学者还是有必要了解下,细致说明他们是什么,需要的朋友可以参考下
摇滚jvm-scala初学者
初学Java——Java语言继承了Smalltalk的OOP的特性,是广泛运用的编程语言中的OOP的代表 再学Java——适用于网络开发的平台无关性语言,在Java的Object对象实现了wait,notify的对象级别的多线程的管程机制,让每一个...
JDK、JRE、以及JVM 及初学配置 非常清晰的PDF