﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-我的JAVA生涯-文章分类-JVM</title><link>http://www.blogjava.net/xiaolixv/category/32290.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 18 Jun 2008 15:19:39 GMT</lastBuildDate><pubDate>Wed, 18 Jun 2008 15:19:39 GMT</pubDate><ttl>60</ttl><item><title>JAVA的CLASS文件结构（一）</title><link>http://www.blogjava.net/xiaolixv/articles/208994.html</link><dc:creator>lixv</dc:creator><author>lixv</author><pubDate>Wed, 18 Jun 2008 12:51:00 GMT</pubDate><guid>http://www.blogjava.net/xiaolixv/articles/208994.html</guid><wfw:comment>http://www.blogjava.net/xiaolixv/comments/208994.html</wfw:comment><comments>http://www.blogjava.net/xiaolixv/articles/208994.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaolixv/comments/commentRss/208994.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaolixv/services/trackbacks/208994.html</trackback:ping><description><![CDATA[<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;JVM的可执行文件是*.Class格式，每个*.JAVA文件经过编译器编译后都要生成ClassFile文件。ClassFile文件是由一个8位的字节流组成，每ClassFile都有着固定的格式。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ClassFile的文件结构：(表一)&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p align="center">
<table style="width: 1028px; border-collapse: collapse; height: 124px" bordercolor="#000000" cellspacing="2" cellpadding="2" width="1028" border="1">
    <tbody>
        <tr>
            <td style="width: 152px; height: 29px" valign="top">&nbsp;&nbsp;字节数&nbsp;</td>
            <td>名称</td>
            <td>备注</td>
        </tr>
        <tr>
            <td>4&nbsp;&nbsp;</td>
            <td>Magic</td>
            <td>值为OXCAFEBABE 用来标记CLASS的文件</td>
        </tr>
        <tr>
            <td>4&nbsp;&nbsp;</td>
            <td>Version</td>
            <td>其中前两位是副版本号，后两位是主版本号</td>
        </tr>
        <tr>
            <td>2&nbsp;</td>
            <td>Constant_pool_count</td>
            <td>Constat_pool总数，根据自己数我们可知一个JAVA类文件中最多能有65535个Constant_pool</td>
        </tr>
        <tr>
            <td>不定长&nbsp;&nbsp;&nbsp;</td>
            <td>Constant_pool[]</td>
            <td>用来描述Constant_pool中各种字符串常数，类名和其他变长结构的表。Constant_Pool表的第一项是JVM内部使用的不显示在ClassFile中，因此Constant_pool中显示的Item应该从1~Constant_pool_count-1。<strong>注：这是ClassFile文件中最关键的部分之一。（见表三）</strong></td>
        </tr>
        <tr>
            <td>2</td>
            <td>access_flag</td>
            <td>类和接口中使用的修饰符掩码。（见表二） 其中：CLASSFILE可以使用的修饰符可以相加。如：0X0200表示Public,0x0001表示Class,则：0x0021表示Public Class。</td>
        </tr>
        <tr>
            <td>2</td>
            <td>this_class&nbsp;&nbsp;&nbsp;&nbsp;</td>
            <td>表示ClassFile中的定义的类或者接口；this_class的项必须是Constant_pool中的有效索引</td>
        </tr>
        <tr>
            <td>2</td>
            <td>super_class</td>
            <td>
            <p>对于一个类Super_class项的值必须为0，或者Constant_pool表的一个有效索引。如果Super_class项的值不为零，则该索引处的constant_pool表项必须是classfile定义类的超类CONSTANT_class_info结构。此类不能位Final。</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 若Super_class的值为零，则该classfile必须表示java.lang.Object. 它是唯一的没有超类的类或者接口。</p>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对于接口，Super_class的值必须总是constat_pool表的一个有效索引，该索引处的constant_pool表项必须是表示类java.lang.Object的一个CONSTANT_Class_info结构。</td>
        </tr>
        <tr>
            <td>2</td>
            <td>interfaces_count</td>
            <td>类或接口的直接超类接口的个数</td>
        </tr>
        <tr>
            <td>2</td>
            <td>interface[]</td>
            <td>Constant_pool表的有效索引。其中，interace[i]是CONSTANT_Class_info的结构。</td>
        </tr>
        <tr>
            <td>2</td>
            <td>fields_count</td>
            <td>fields_info结构的个数。</td>
        </tr>
        <tr>
            <td></td>
            <td>fields[]</td>
            <td>见field_info结构表</td>
        </tr>
        <tr>
            <td>2</td>
            <td>methods_count</td>
            <td>method_info结构的个数</td>
        </tr>
        <tr>
            <td></td>
            <td>methods[]</td>
            <td>结构见Method_info</td>
        </tr>
        <tr>
            <td>2</td>
            <td>attributes_count</td>
            <td>attributes表中的个数</td>
        </tr>
        <tr>
            <td></td>
            <td>attributes[]</td>
            <td>attributes[]的每个值是一个变长属性结构。一个classfile结构可以有与他相关联的任意个数的属性。</td>
        </tr>
    </tbody>
</table>
</p>
<img src ="http://www.blogjava.net/xiaolixv/aggbug/208994.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaolixv/" target="_blank">lixv</a> 2008-06-18 20:51 <a href="http://www.blogjava.net/xiaolixv/articles/208994.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>