java class字节码文件解读

论坛 期权论坛     
选择匿名的用户   2021-5-30 02:14   421   0
<div id="js_content">
<p> <br></p>
<p style="text-align: center"><img src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-c20fa8e461dde827ac04472aa6c6f42a"></p>
<p>java程序员基本都知道java代码需要经过javac编译,编译后的文件我们称为class字节码文件,然后这个class文件就可以被jvm虚拟机加载然后运行程序,可以看出要真正理解java语言原理,我们得先了解下这个class文件。</p>
<p> </p>
<p>就目前成熟阶段的计算机发展来说,我们知道大部分跟计算机有关的设计都逃不出一个概念叫:规则,没有规则不成方圆,所以了解class字节码文件也是一样的套路,得了解它的规则。</p>
<h2><strong><br></strong></h2>
<h2><strong>class字节码规则</strong></h2>
<p>首先我们知道,计算机中存储任何数据都得告诉有个长度或大小的概念,最小单位是位(bit)。很多开发语言都是通过类型的方式来描述变量数据的长度,比如int长度为32位(8个字节),long长度为64位。class文件中也一样,通过u1表示无符号类型1个字节(1个子节&#61;8位),u2表示无符号类型2个子节(16位),u4表示4个子节,u8表示8个子节。下面是class字节码文件的规则(粗略过一遍就行了):</p>
<table><tbody><tr><td width="89"><p><strong>类型</strong></p></td><td width="290"><p><strong>名称</strong></p></td><td width="189"><p><strong>数量</strong></p></td></tr><tr><td width="89"><p>u4</p></td><td width="290"><p>magic(魔数)</p></td><td width="189"><p>1</p></td></tr><tr><td width="89"><p>u2</p></td><td width="290"><p>minor_version(次版本)</p></td><td width="189"><p>1</p></td></tr><tr><td width="89"><p>u2</p></td><td width="290"><p>major_version(主版本)</p></td><td width="189"><p>1</p></td></tr><tr><td width="89"><p>u2</p></td><td width="290"><p>constant_pool_count(常量池数量)</p></td><td width="189"><p>1</p></td></tr><tr><td width="89"><p>cp_info</p></td><td width="290"><p>constant_pool(常量池信息)</p></td><td width="189"><p>constant_pool_count - 1</p></td></tr><tr><td width="89"><p>u2</p></td><td width="290"><p>access_flags(类访问标记)</p></td><td width="189"><p>1</p></td></tr><tr><td width="89"><p>u2</p></td><td width="290"><p>this_class(类索引)</p></td><td width="189"><p>1</p></td></tr><tr><td width="89"><p>u2</p></td><td width="290"><p>super_class(父类索引)</p></td><td width="189"><p>1</p></td></tr><tr><td width="89"><p>u2</p></td><td width="290"><p>interfaces_count(接口数量)</p></td><td width="189"><p>1</p></td></tr><tr><td width="89"><p>u2</p></td><td width="290"><p>interfaces(接口索引集合)</p></td><td width="189"><p>interfaces_count</p></td></tr><tr><td width="89"><p>u2</p></td><td width="290"><p>fields_count(类变量和成员变量数量)</p></td><td width="189"><p>1</p></td></tr><tr><td width="89"><p>field_info</p></td><td width="290"><p>fields(类变量和成员变量集合)</p></td><td width="189"><p>fields_count</p></td></tr><tr><td width="89"><p>u2</p></td><td width="290"><p>methods_count(类方法和成员方法数量)</p></td><td width="189"><p>1</p></td></tr><tr><td width="89"><p>method_info</p></td><td width="290"><p>methods(类方法和成员方法集合)</p></td><td width="189"><p>methods_count</p></td></tr><tr><td width="89"><p>u2</p></td><td width="290"><p>attributes_count(jvm自定义其它属性数量)</p></td><td width="189"><p>1</p></td></tr><tr><td width="89"><p>attribute_info</p></td><td width="290"><p>attributes(jvm自定义其它属性集合)</p></td><td width="189"><p>attributes_count</p></td></tr></tbody></table>
<p> </p>
<p>上图光看中文描述部分看是不是很多关键字挺熟悉,父类、属性、方法等等,其实class字节码规则就是通过二进制映射到java语法信息的方式形成一张大且层次结构复杂的映射表,有点类似java语言中的枚举,更准确说像计算机的类似ASCII编码表,只是class映射表是复合结构层次的,更复杂些。有了这个概念,我们通过下面的样例代码开始来分析class字节码的映射关系。</p>
<h2><strong><br></strong></h2>
<h2><strong>样例代码</strong></h2>
<p>在某个目录创建3个类,一个接口、一个父类、一个子类,代码分别如下:</p>
<p><strong>父类ParentClass.java</strong></p>
<p> </p>
<pre class="blockcode"><code class="language-cs">public class ParentClass {




    private String name;


    public String getName() {
        return name;
    }


    public void setName(String name) {
        this.name &#61; name;
    }
}
</code></pre>
<p><strong>接口类ParentInterface.java</strong><br></p>
<pre class="blockcode"><code class="language-cs">public interface ParentInterface {


    public String getMyName();


}
</code></pre>
<p><strong>子类SubClass.java</strong></p>
<pre cl
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP