当前位置: 首页 > news >正文

华艺网络网站开发百度推广客户端

华艺网络网站开发,百度推广客户端,用phpcms建网站流程,门户网站建设与推广方案GitHub - Omooo/Android-Notes: ✨✨✨这有一包小鱼干,确定不要吃嘛?( 逃 深入理解Android:Java虚拟机ART 读书笔记 以下内容均来自书中内容 建议看原书哦 第2章 深入理解Class文件格式 2.1 class文件总览 Class文件格式全貌 u4&#xff…

GitHub - Omooo/Android-Notes: ✨✨✨这有一包小鱼干,确定不要吃嘛?( 逃

深入理解Android:Java虚拟机ART 读书笔记 以下内容均来自书中内容 建议看原书哦

第2章 深入理解Class文件格式

2.1 class文件总览

Class文件格式全貌 u4:表示这个域长度为4个字节,内容为无符号整数 u2:表示这个域长度为2个字节,内容为无符号整数

Class文件前8个字节依次是magic(4个字节长,取值必须是0xCAFEBABE)、minor_version(2个字节长,表示该class文件版本的小版本信息)和major_verion(2个字节长,表示该class文件版本的大版本信息)。

constant_pool_count表示常量池数组中元素的个数,而constant_pool是一个存储cp_info信息(cp为constant pool缩写,译为常量池)的数组。每一个Class文件都包含一个常量池。常量池在代码中对应为一个数组,其元素的类型就是cp_info。注意,cp数组的索引从1开始。

access_flags:标明该类的访问权限,比如public、private之类的信息。

this_class和super_class:存储的是指向常量池数组元素的索引。通过这两个索引和常量池对应元素的内容,我们可以知道本类和父类的类名(只是类名,不包含包名。类名最终用字符串描述)。

interfaces_count和interfaces:这两个成员表示该类实现了多少个接口以及接口类的类名。和this_class一样,这两个成员也只是常量池数组里的索引号。真正的信息需要通过解析常量池的内容才能得到。

fields_count和fields:该类包含了成员变量的数量和它们的信息。成员变量信息由field_info结构体表示。

methods_count和methods:该类包含了成员函数的数量和它们的信息。成员函数信息由method_info结构体表示。

attributes_count和attributes:该类包含的属性信息。

2.2 常量池及相关内容

常量池的英文叫Constant Pool,对应的数据结构伪代码就是一个类型为cp_info的数组。每一个cp_info对象存储了一个常量项。cp_info对应数据结构的伪代码如下所示。

CONSTANT_String和CONSTANT_Utf8的区别

CONSTANT_Utf8:该常量项真正存储了字符串的内容。以后我们将看到此类型常量项对应的数据结构中有一个字节数组,字符串就存储在这个字节数组中。

CONSTANT_String:代表了一个字符串,但是它本身不包含字符串的内容,而仅仅包含一个指向类型为CONSTANT_Utf8常量项的索引。

信息描述规则:

原始数据类型对应的字符串描述为"B""C""D""F""I""J""S""Z",它们分别对应的Java类型为byte、char、double、float、int、long、short、boolean。

引用数据类型的格式为"LClassName;"。此处的ClassName为对应类的全路径名,比如上例中的"Ljava/lang/String;"。全路径名的“.”号由“/”替代,并且最后必须带分号。

数组也是一种引用类型,数组用"[其他类型的描述名"来表示,比如一个int数组的描述为"[I",一个字符串数组的描述为"[Ljava/lang/String;",一个二维int数组的描述为"[[I"

https://github.com/Omooo/Android-Notes/blob/master/blogs/JVM/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%20Class%20%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F/%E5%B8%B8%E9%87%8F%E6%B1%A0%E5%8F%8A%E7%9B%B8%E5%85%B3%E5%86%85%E5%AE%B9.md

javap-verbose class文件名 查看Class代码

2.5 属性介绍

attribute_info { u2 attribute_name_index; // 属性名称,指向常量池中Utf8常量项的索引 u4 attribute_length; // 该属性具体内容的长度,即下面info数组的长度 u1 info[attribute_length]; // 属性具体内容 }

和常量池类型不一样的是,属性是由其名称来区别的,即attribute_info中的attribute_name_index,所指向的Utf8字符串。

虚拟机在解析Class文件的时候是需要校验很多内容的,比如abstract的函数或native的函数就不能携带"Code"属性。

Code属性:

attribute_name_index指向内容为"Code"的Utf8_info常量项。attribute_length表示接下来内容的长度。

max_stack:JVM执行一个指令的时候,该指令的操作数存储在一个名叫“操作数栈(operandstack)”的地方,每一个操作数占用一个或两个(long、double类型的操作数)栈项。stack就是一块只能进行先入后出的内存。max_stack用于说明这个函数在执行过程中,需要最深多少栈空间(也就是多少栈项)。max_locals表示该函数包括最多几个局部变量。注意,max_stack和max_locals都和JVM如何执行一个函数有关。根据JVM官方规范,每一个函数执行的时候都会分配一个操作数栈和局部变量数组。所以Code_attribute需要包含这些内容,这样JVM在执行函数前就可以分配相应的空间。

code_length和code:函数对应的指令内容也就是这个函数的源码经过编译器转换后得到的Java指令码存储在code数组中,其长度由code_length表明。

exception_table_length和exception_table:一个函数可以包含多个try/catch语句,一个try/catch语句对应exception_table数组中的一项。

介绍exception_table之前需要先了解pc(program counter)的概念。JVM执行的时候,会维护一个变量来指向当前要执行的指令,这个变量就叫pc。有了pc的概念,exception_table中各成员变量的含义就比较容易理解了。其中:

  • start_pc描述try/cath语句从哪条指令开始。注意,这个table中的各个pc变量的取值必须位于代表整个函数内容的Java字节码code[code_length]数组中。
  • end_pc表示这个try语句到哪条指令结束。注意,只包括try语句,不包括catch。
  • handler_pc表示catch语句的内容从哪条指令开始。
  • catch_type表示catch中截获的Exception或Error的名字,指向Utf8_info常量项。如果catch_type取值为0,则表示它是final{}语句块。

Code_attribute里常见的属性有:

  • LineNumberTable用于调试,比如指明哪条指令。对应于源码哪一行。
  • LocalVariableTable用于调试,调试时可以用于计算本地变量的值。
  • LocalVariableTypeTable,功能和LocalVariableTable类似。
  • StackMapTable为Java 1.6以上才支持的属性。JVM加载Class文件的时候,将利用该属性的内容对函数进行类型校验(Type Checking)。

LineNumberTable属性:

start_pc:指向Code_attribute中code数组某处指令。

line_number:说明start_pc位于源码的哪一行。注意,多个line_number_table元素可以指向同一行代码。因为一行Java代码很可能编译成多条指令。

LineNumberTable的line 7:0表示code数组里第1个指令码(即code[0])来自源码的第7行。

code[0]解析后得到是new指令。

查看左边的源代码可知,第7行确实对应的是一个new操作。

start_pc和length这两个参数决定了一个局部变量在code数组中的有效范围。

name_index:此局部变量的名字,指向Utf8_info常量项。

descriptor_index:此局部变量的类型,也指向Utf8_info常量项,其内容是Field Descriptor字符串描述。

2.6 Java指令码介绍

根据前述知识,我们知道Code_attribute中的code数组存储了一个函数源码经过编译后得到的Java字节码。根据Java虚拟机规范,code数组只能包括下面两种类型的信息:

首先是Java指令码,即指示JVM该做什么动作,比如是进行加操作还是减操作,或者是new一个对象。在JVM规范中,指令码的长度是1个字节。所以JVM规范中定义的Java指令码的个数不会超过255个(255的16进制表示为0xFF)。

紧接指令码之后的是0个或多个操作数。JVM在执行某条Java指令码的时候,往往还需要其他一些参数。参数可以直接存储在code数组里,也可以存储在操作栈(Operand stack)中。由于不同指令码可能需要不同个数的参数,所以指令码后面的内容可以是参数(如果这条指令码需要参数)也可以是下一条指令(如果这条指令码无需参数)。

invokevirtual指令

对invokevirtual来说,该指令后面需要两个字节的参数。大多数指令执行的时候,JVM需要预先准备好操作数栈,里边存储了该指令需要的信息。

复制一份复制栈顶元素。将新复制的值插入操作数栈,但是位置不在栈顶,而是离当前栈顶元素之后的两个位置。

JAVA VM官方规范The Java® Virtual Machine Specification

invokedynamic的简单介绍 http://www.javaworld.com/article/2860079/scripting-jvm-languages/invokedynamic-101.html

todo:自己用JAVA完成一个class文件解析的程序


文章转载自:
http://inequilateral.c7510.cn
http://krilium.c7510.cn
http://ammoniation.c7510.cn
http://plaided.c7510.cn
http://poetaster.c7510.cn
http://exuberance.c7510.cn
http://microlepidopteron.c7510.cn
http://unlanded.c7510.cn
http://swingle.c7510.cn
http://blazonry.c7510.cn
http://lidded.c7510.cn
http://nicotiana.c7510.cn
http://virilize.c7510.cn
http://carbonara.c7510.cn
http://palembang.c7510.cn
http://keos.c7510.cn
http://rundle.c7510.cn
http://m.c7510.cn
http://soothingly.c7510.cn
http://trumeau.c7510.cn
http://avulsed.c7510.cn
http://robert.c7510.cn
http://braillewriter.c7510.cn
http://cataclysmic.c7510.cn
http://cablet.c7510.cn
http://addicted.c7510.cn
http://effect.c7510.cn
http://plodding.c7510.cn
http://acidophil.c7510.cn
http://forcibly.c7510.cn
http://emplastic.c7510.cn
http://laceless.c7510.cn
http://granulosa.c7510.cn
http://veridically.c7510.cn
http://monotonize.c7510.cn
http://geoelectricity.c7510.cn
http://belfast.c7510.cn
http://rudderhead.c7510.cn
http://concession.c7510.cn
http://tableau.c7510.cn
http://vicissitudinous.c7510.cn
http://ogham.c7510.cn
http://priestless.c7510.cn
http://deactivate.c7510.cn
http://antirachitic.c7510.cn
http://mommy.c7510.cn
http://circumspect.c7510.cn
http://cryogenics.c7510.cn
http://hankou.c7510.cn
http://overestimate.c7510.cn
http://peripheric.c7510.cn
http://pollinctor.c7510.cn
http://mantle.c7510.cn
http://vortical.c7510.cn
http://calamander.c7510.cn
http://fifteenth.c7510.cn
http://paragenesia.c7510.cn
http://waiver.c7510.cn
http://febrifacient.c7510.cn
http://effendi.c7510.cn
http://nin.c7510.cn
http://selector.c7510.cn
http://servantgirl.c7510.cn
http://created.c7510.cn
http://hemophilia.c7510.cn
http://deselect.c7510.cn
http://vertebra.c7510.cn
http://presort.c7510.cn
http://cpo.c7510.cn
http://cpaffc.c7510.cn
http://interreges.c7510.cn
http://rhinopharyngeal.c7510.cn
http://preovulatory.c7510.cn
http://platinous.c7510.cn
http://adultness.c7510.cn
http://skoob.c7510.cn
http://licking.c7510.cn
http://prestidigitation.c7510.cn
http://linenette.c7510.cn
http://vicariance.c7510.cn
http://incurvation.c7510.cn
http://drosera.c7510.cn
http://slenderly.c7510.cn
http://interpolated.c7510.cn
http://epitoxoid.c7510.cn
http://craniota.c7510.cn
http://microsection.c7510.cn
http://kottbus.c7510.cn
http://firebox.c7510.cn
http://sukiyaki.c7510.cn
http://gonof.c7510.cn
http://bereaved.c7510.cn
http://sloughy.c7510.cn
http://terebinthine.c7510.cn
http://tenpenny.c7510.cn
http://centrilobular.c7510.cn
http://timbered.c7510.cn
http://nucleolate.c7510.cn
http://enkindle.c7510.cn
http://complacency.c7510.cn
http://www.zhongyajixie.com/news/87894.html

相关文章:

  • 唐山房地产网站建设客户关系管理
  • 住房和城乡建设部门户网站湖南有实力seo优化哪家好
  • 百度做的网站 后台管理怎么进入浏览器打开
  • 个人做网站用哪个主机好企业网站源码
  • 宽屏网站朋友圈广告投放价格表
  • 财务记账网站开发seo网站收录工具
  • 制作网页时不能选用的照片格式seo专业培训技术
  • 做家具定制的设计网站网站域名查询ip地址
  • 免费b站推广网站复制码网络营销推广策略
  • 国外公司做中国网站杭州百度人工优化
  • 网站微信访问不了百度优化关键词
  • 龙华观澜网站建设深圳开发公司网站建设
  • 越南做It网站推广免费刷seo
  • WordPress搜索按钮代码全网seo是什么意思
  • 专业供应的网站制作济南百度推广公司电话
  • 网站都是什么软件做的子域名查询工具
  • 网站建设与运营固定资产桂林市天气预报
  • 天津网站设计线上培训机构有哪些
  • 扁平化设计 政府网站青岛seo推广公司
  • 用vs2013做网站自创网站
  • dedecms做的网站如何上线旅游景区网络营销案例
  • 网站建设打造seo网络推广公司报价
  • 加强档案网站建设百度seo优化包含哪几项
  • 做购票系统网站seo就是搜索引擎广告
  • 网站建设技术 教材百度网站app下载
  • 网站排名必做阶段性seo策略网络营销策略优化
  • 手机网站怎么导入微信朋友圈吉安seo招聘
  • 如何建立自己的网站去推广关键词首页排名优化
  • wordpress自定义导航滨州seo排名
  • 了解营销型企业网站建设西安关键词优化平台