class文件是指以.class为文件后缀的Java虚拟机可装载文件。无论该class文件是在linux上进行编译的,还是在windows环境下编译的,无论虚拟机是在何种平台下实现和运行的,class文件使得Java虚拟机可以正确的读取、解释所有的class文件。 在分析和研究c ...
class文件是指以.class为文件后缀的Java虚拟机可装载文件。无论该class文件是在linux上进行编译的,还是在windows环境下编译的,无论虚拟机是在何种平台下实现和运行的,class文件使得Java虚拟机可以正确的读取、解释所有的class文件。 在分析和研究class文件之前,先提出有一些问题:
1.类/接口(class文件也可能定义的是接口,所以还是不要理解为类文件为好)内有哪些内容?
2.以上内容分别保存在class文件的什么地方?
3.这些内容在加载过程中又如何被读取和解析?
4.这些内容加载后又会被解析成为什么样的数据结构保存在虚拟机中?
5.这些数据结构在虚拟机的运行过程中又是如何被使用的?
扩展问题:
6.如何防止class文件被劫持?
7.如何防止class文件被反编译?
class文件的组织结构定义如下:
ClassFile{magic u4,minor_version u2,major_version u2,constant_pool_count u2,constant_pool cp_info*constant_pool_count,access_flags u2,this_class u2,super_class u2,interface_count u2,interfaces u2 * interface_count,fields_count u2,fields field_info * fields_count,methods_count u2,methods method_info * methods_count,attributes_count u2,attributes attributes_info * attributes_count}
这里只实现了一个接口,就是5号常量池,即全限定名”TestInterface”所定义的接口
8.fields_count/fields(字段数和字段) 该属性的 该属性的 其生成的class文件如下: 其InnerClasses属性内容为: 其中匿名内部类Runnable的全限定名为InnerClassTest$1,由于其不是一个成员嵌套类(该类是局部嵌套类),其outer_class_info_index 为0,由于该类是一个匿名内部类,其inner_name_index为0(即简单名称为空) 在subClass的class文件中也有着如下的InnerClasses属性: 可以看出,每个作为外围类的内部类的类都将保存在该外围类的CONSTANT_Class常量池中,并有一个inner_class_info结构加以描述
原标题:实例探索Class文件
关键词:
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。