欢迎访问昆山宝鼎软件有限公司网站! 设为首页 | 网站地图 | XML | RSS订阅 | 宝鼎邮箱 | 后台管理


新闻资讯

MENU

软件开发知识

那后面就是对 图纸加密 属性表的分析了

点击: 次  来源:宝鼎软件 时间:2018-11-21

原文出处: 拿笔小星_

这里给各人先容一款字节码阐明小东西——jclasslib bytecode viewer。它可以将字节码文件布局化的揭示给我们看。

紧接着上篇『字段表』的阐明。后头的阐明轮到了『要领表』。

要领表布局

  • u2 method_count:要领计数器,methods_count 的值暗示当前 class 文件 methods[]数组的成员个数。
  • method_info methods[methods_count]: 要领表,methods[]数组中的每个成员都必需是一个 method_info 布局的数据项,用于暗示当前类或接口中某个要领的完整描写。
  • method_info 布局:
  • method_info {
    	u2 access_flag                     1
    	u2 name_index                      1
    	u2 descriptor_index                1
    	u2 attribute_count                 1
    	attribute_info attributes[attribute_count]
    }

    要领表的详细理会

    知道要领表的构成布局,我们就可以直接比较着字节码文件去理会了。依然是前文用的java代码示例发生的字节码文件。紧接在『字段表』后头的16进制是0×0004=4。即该类有4个成员要领!看源代码:

    public class MyTest2 {
        String str = "Welcome";
        private int x = 5;
        public static Integer in = 10;
    
        public static void main(String[] args) {
            MyTest2 myTest2 = new MyTest2();
            myTest2.setX(8);
    
            in = 20;
        }
        public void setX(int x) {
            this.x = x;
        }
    }

    源代码中,我们只界说了2个成员要领!可是字节码却说有4个要领。我们用jclasslib小东西打开看一下。展示如下:

    那后头就是对 图纸加密 属性表的阐明白

    这样就一目了然了,其实字节码里除了我们本身显示界说的2个要领 main 和 setX。Java编译器生成字节码的时候默认又帮我们生成了2个要领 <init> 和 <clinit>

    <init>要领就是默认的结构要领。我们知道,一个类必需要有至少一个结构要领,用来完成类的实例化进程。当我们没有显示去给一个类界说一个结构要领时,Java编译器在为生成字节码文件时,会默认给它生成一个默认的结构要领。
    <clinit>要领是类的结构器。是类初始化阶段要执行的要领,它的职责就是为类的静态变量赋初始值(由措施员界说的谁人初始值,在我们的源码中就是静态变量in的初始值10),可能假如类中有静态代码块,那就并按顺序执行静态代码块的代码。

    所以,当一个类有静态变量可能静态代码块的时候,昆山软件开发,Java编译器会为这个类的字节码里生成一个<clinit>要领,在类初始化阶段去执行!

    这就是为什么代码中我们只界说了2个要领,但生成的字节码里却有4个要领的原因了。

    阐明第一个要领。先看看要领表的部门16进制的信息,如下:从0×004开始。

    那后头就是对 图纸加密 属性表的阐明白

    首先是要领的access_flag(会见符号位),即0×0001。说明此要领是public。接着是要领的name_index(指向常量池的索引,代表要领的全限命名称),0×0011=17。我借助jclasslib小东西可以查到要领名称是<init>,就是Java编译器默认生成的结构要领。然后,是该要领的描写符信息descriptor_index,0×0012=18,同样可以查到()V。这个描写符说明我们的要领是无参的『()』。且无返回值『V』。完美切合我们结构要领的界说。

    属性表阐明

    我们再看看它的属性个数,attributes_count的项的值暗示这个要领的附加属性的数量。0×0001=1,说明这个要领只有一个附加属性。那后头就是对属性表的阐明白。我们先看一部属性表的布局:

    attribute_info {
    	u2 attribute_name_index;
    	u4 attibute_length;
    	u1 info[attibute_length]
    }

    所以,0×0013=19。暗示的就是这个属性的名字在常量池中的索引。查阅得,该属性的名字是『Code』。Code属性很重要,因为Java措施要领中的代码颠末javac编译之后形成字节码存在了Code属性内。在这里,昆山软件开发,昆山软件开发,我们通过jclasslib先查察一下Code属性里有什么。

    那后头就是对 图纸加密 属性表的阐明白

    红框里的助记符就是<init>要领里要执行的代码逻辑!

    Code属性

  • 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];
    }
  • Java措施要领体中的代码颠末Java编译处理惩罚后,最终酿成字节码指令存储在Code属性中。Code属性呈此刻要领表的属性荟萃中,可是并非所有要领都有这个属性。譬喻接口可能类中的抽象要领就不存在Code属性。