java代码编译成class文件之后,class文件里面的语法是什么样的,他的数据类型是什么以及如何存放的??

class也是一种语言写的,只不过和我们的java语法不同而已。

class文件就是把java文件转换成他自己的语法格式(类比把java的排序算法用C++写一样,仅仅是语法的不同而已)

=====================================================================================================

class文件时给虚拟机看的,所以比较紧凑,尽量减少存储空间

对于一个java类,编译以后,使用另一种语法字节码表示,类是一个模板,要存储元数据信息,这些信息也需要占存储空间,(类名,访问属性,字段属性,字段名称,返回值以及方法名称,参数值,以及方法体),也就是说,编译基本确定了类元数据占用的信息,方法体执行的空间大小(栈深度)

=====================================================================================================

数据类型:基本单位为一个字节为单位:

  基本类型:u1,u2,u4,u8

  表类型:u1,u2,u3,u4类型的组合体(类似于结构体或者对象体)

对呀,class数据类型就仅仅这两种,不像java里面的Int,Long,Object这么多的数据类型(给开发人员看的,所以比较丰富,不想给计算机看的就0.1,人看的太复制,浪费时 间)。

====================================================================================================

1.魔数(文件格式的表示,就是一个标示作用)

2.版本(什么版本的java)

3.常量池:(仅仅是对一些表述信息的应用)------仅仅存储应用(看来class文件也就应用)

     class类名,字段类型,方法,构造方法,静态方法  这些信息的属于类的数据结构信息,是一个模板(操作指令流程组合)信息,所以在Class存储常量池里面引用

     init-----自动添加的构造方法

     clinit---自动添加的静态快

例子: 

package com.jg.zhang;

public class Programer extends Person {

	static String company = "CompanyA";

	static{
System.out.println("staitc init");
} String position;
Computer computer; public Programer() {
this.position = "engineer";
this.computer = new Computer();
} public void working(){
System.out.println("coding...");
computer.working();
}
} 说白了就是对其进行描述信息。所有的实例对象对这些仅仅引用一下就行

  

#2 = Utf8               com/jg/zhang/Programer          //当前类的全限定名
#4 = Utf8 com/jg/zhang/Person //父类的全限定名
#5 = Utf8 company //company字段的名称
#6 = Utf8 Ljava/lang/String; //company和position字段的描述符
#7 = Utf8 position //position字段的名称
#8 = Utf8 computer //computer字段的名称
#9 = Utf8 Lcom/jg/zhang/Computer; //computer字段的描述符
#10 = Utf8 <clinit> //类初始化方法(即静态初始化块)的方法名
#11 = Utf8 ()V //working方法的描述符
#12 = Utf8 Code //Code属性的属性名
#14 = Utf8 CompanyA //程序中的常量字符串
#19 = Utf8 java/lang/System //所引用的System类的全限定名
#21 = Utf8 out //所引用的out字段的字段名
#22 = Utf8 Ljava/io/PrintStream; //所引用的out字段的描述符
#24 = Utf8 staitc init //程序中的常量字符串
#27 = Utf8 java/io/PrintStream //所引用的PrintStream类的全限定名
#29 = Utf8 println //所引用的println方法的方法名
#30 = Utf8 (Ljava/lang/String;)V //所引用的println方法的描述符
#31 = Utf8 LineNumberTable //LineNumberTable属性的属性名
#32 = Utf8 LocalVariableTable //LocalVariableTable属性的属性名
#33 = Utf8 <init> //当前类的构造方法的方法名
#41 = Utf8 com/jg/zhang/Computer //所引用的Computer类的全限定名
#45 = Utf8 this //局部变量this的变量名
#46 = Utf8 Lcom/jg/zhang/Programer; //局部变量this的描述符
#47 = Utf8 working //woking方法的方法名
#49 = Utf8 coding... //程序中的字符串常量
#52 = Utf8 SourceFile //SourceFile属性的属性名
#53 = Utf8 Programer.java //当前类所在的源文件的文件名

  

package com.jg.zhang;

public class Person {

	int age;

	int getAge(){
return age;
}
}

  

   #1 = Class              #2             //  com/jg/zhang/Person
#2 = Utf8 com/jg/zhang/Person
#3 = Class #4 // java/lang/Object
#4 = Utf8 java/lang/Object
#5 = Utf8 age
#6 = Utf8 I
#7 = Utf8 <init>
#8 = Utf8 ()V
#9 = Utf8 Code
#10 = Methodref #3.#11 // java/lang/Object."<init>":()V
#11 = NameAndType #7:#8 // "<init>":()V
#12 = Utf8 LineNumberTable
#13 = Utf8 LocalVariableTable
#14 = Utf8 this
#15 = Utf8 Lcom/jg/zhang/Person;
#16 = Utf8 getAge
#17 = Utf8 ()I
#18 = Fieldref #1.#19 // com/jg/zhang/Person.age:I
#19 = NameAndType #5:#6 // age:I
#20 = Utf8 SourceFile
#21 = Utf8 Person.java 

 

常量池里面的两种类型:

CONSTANT_Utf8_info -------------------字符串, 包括方法名, 字段名, 描述符

CONSTANT_NameAndType_info----------方法符号引用或字段的符号引用的一部分,也就是说, 如果在源文件中调用了一个方法, 或者引用了一个字段(不管是本类中的方法和字段, 还是引用其他类中的方法和字段), 那么和这个方法或在字段相对应的CONSTANT_NameAndType_info 就会出现在常量池中.如果只在当前类中定义了一个字段而不访问它, 或者定义了一个方法而不调用它, 那么常量池中就不会出现对应的CONSTANT_NameAndType_info 数据项.

CONSTANT_NameAndType_info 中引用了两个CONSTANT_Utf8_info, 一个叫做name_index, 存储方法名或字段名, 一个叫做descriptor_index, 存储方法描述符或字段描述符。

转自:http://blog.csdn.net/szwangdf/article/details/25616101

class文件格式说明的更多相关文章

  1. RIFF和WAVE音频文件格式

    RIFF file format RIFF全称为资源互换文件格式(Resources Interchange File Format),是Windows下大部分多媒体文件遵循的一种文件结构.RIFF文 ...

  2. JavaSe:Properties文件格式

    Properties文件格式说明 Properties继承自Hashtable,是由一组key-value的集合. 在Java中,常用properties文件作为配置文件.它的格式是什么样的呢? 下图 ...

  3. Dotnet文件格式解析

    0x0.序 解析过程并没有介绍对pe结构的相关解析过程,网上此类相关资料很多可自行查阅,本文只介绍了网上资料较少的从pe结构的可选头中的数据目录表中获取dotnet目录的rva和size,到完全解析d ...

  4. Reverse Core 第二部分 - 13章 - PE文件格式

    @date: 2016/11/24 @author: dlive ​ PE (portable executable) ,它是微软在Unix平台的COFF(Common Object File For ...

  5. iOS 图片文件格式判断、圆角图片

    1.圆角图片 // 设置圆形图片(放到分类中使用) - (UIImage *)cutCircleImage { UIGraphicsBeginImageContextWithOptions(self. ...

  6. 基于 Hive 的文件格式:RCFile 简介及其应用

    转载自:https://my.oschina.net/leejun2005/blog/280896 Hadoop 作为MR 的开源实现,一直以动态运行解析文件格式并获得比MPP数据库快上几倍的装载速度 ...

  7. 图解JVM的Class文件格式(详细版)

          了解JAVA的Class文件结构有助于掌握JAVA语言的底层运行机制,我在学习的过程中会不断的与ELF文件格式作对比(当然他们的复杂程度.格式相去甚远,比如可执行ELF的符号表解析在静态链 ...

  8. dex文件格式一

    一.生成dex文件 我们可以通过java文件来生成一个简单的dex文件 编译过程: 首先编写java代码如下: (1) 编译成 java class 文件 执行命令 : javac Hello.jav ...

  9. dex文件格式二

    一. dex文件头 (1) magic value 在DexFile.c   dexFileParse函数中 会先检查magic opt 啥是magic opt呢? 我们刚刚从cache目录拷贝出来的 ...

  10. stl文件格式

    http://wenku.baidu.com/view/a3ab7a26ee06eff9aef8077b.html [每个三角形面片的定义包括三角形各个定点的三维坐标及三角形面片的法矢量[三角形的法线 ...

随机推荐

  1. [sql]join的5种方式:inner join、left(outer) join、right (outer) Join、full(outer) join、cross join

    现在有两张表  如下图所示:             一 .inner join   返回的结果:两个表的交集行 二. left join   是left outer join的简写 返回结果:左表的 ...

  2. 递归--练习10--noi1696逆波兰表达式

    递归--练习10--noi1696逆波兰表达式 一.心得 递归大法好 二.题目 1696:逆波兰表达式 总时间限制:  1000ms 内存限制:  65536kB 描述 逆波兰表达式是一种把运算符前置 ...

  3. Tornado源码分析 --- Redirect重定向

    “重定向”简单介绍: “重定向”指的是HTTP重定向,是HTTP协议的一种机制.当client向server发送一个请求,要求获取一个资源时,在server接收到这个请求后发现请求的这个资源实际存放在 ...

  4. bzoj1179: [Apio2009]Atm scc缩点+dag上dp

    先把强连通缩点,然后变成了dag,dp求终点是酒吧的最长路即可, /************************************************************** Pro ...

  5. IOS-快速集成检查更新

    一直以为Appstore有了检查版本是否更新的机制,我们在APP上做这个更新功能会被拒,但是也有看到一些APP也是做了这个更新功能的.因为在网上没有找到完全正确的方法能获取到iTunes里的数据的,于 ...

  6. Xcode8出现问题总结

    上点干货,目前得知的一些bug解决汇总:iOS10相册相机闪退bughttp://www.jianshu.com/p/5085430b029fiOS 10 因苹果健康导致闪退 crashhttp:// ...

  7. [转载]从B 树、B+ 树、B* 树谈到R 树

    从B 树.B+ 树.B* 树谈到R 树 作者:July.weedge.Frankie.编程艺术室出品. 说明:本文从B树开始谈起,然后论述B+树.B*树,最后谈到R 树.其中B树.B+树及B*树部分由 ...

  8. POJ 1961 循环节

    和POJ 2406 几乎一样.前者是求 该字符串的最小的循环节.也就是最大的循环次数.后者是求该字符串的每个前缀的循环节的最大循环次数.(如果有的话).而且必须大于1.才可以输出.就是POJ 2406 ...

  9. 折叠纸片PFold.js

    PFold.js是一款折叠纸片插件,支持定义折叠纸牌数量.折叠动画效果.折叠方向,而且还支持折叠结束后回调方法. 在线实例 效果一 效果二 效果三 使用方法 <div id="uc-c ...

  10. 《Drools7.0.0.Final规则引擎教程》番外实例篇——相同对象and List使用

    前奏 群组(QQ:593177274)交流中有朋友提出一个问题,怎么实现两个相同对象的插入和比较?相信很多朋友也遇到类似的问题,于是抽时间为大家写一段实例代码,后续代码会同步到GitHub中.下面简单 ...