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

seo做网站赚钱360搜索引擎网址

seo做网站赚钱,360搜索引擎网址,广告公司介绍,phpcms双语网站怎么做this_class 指向常量池中索引为 2 的 CONSTANT_Class_info。super_class 指向常量池中索引为 3 的 CONSTANT_Class_info。由于没有接口,所以 interfaces 的信息为空。 对应 class 文件中的位置如下图所示。 06、字段表 一个类中定义的字段会被存储在字段表&#x…

 

  • this_class 指向常量池中索引为 2 的 CONSTANT_Class_info。
  • super_class 指向常量池中索引为 3 的 CONSTANT_Class_info。
  • 由于没有接口,所以 interfaces 的信息为空。

对应 class 文件中的位置如下图所示。

 

06、字段表

一个类中定义的字段会被存储在字段表(fields)中,包括静态的和非静态的。

来看这样一段代码。

public class FieldsTest {private String name;
}

字段只有一个,修饰符为 private,类型为 String,字段名为 name。可以用下面的伪代码来表示 field 的结构。

field_info {u2 access_flag;u2 name_index;u2 description_index;
}
  • access_flag 为字段的访问标记,比如说是不是 public | private | protected,是不是 static,是不是 final 等。
  • name_index 为字段名的索引,指向常量池中的 CONSTANT_Utf8_info, 比如说上例中的值就为 name。
  • description_index 为字段的描述类型索引,也指向常量池中的 CONSTANT_Utf8_info,针对不同的数据类型,会有不同规则的描述信息。

1)对于基本数据类型来说,使用一个字符来表示,比如说 I 对应的是 int,B 对应的是 byte。

2)对于引用数据类型来说,使用 L***; 的方式来表示,L 开头,; 结束,比如字符串类型为 Ljava/lang/String;

3)对于数组来说,会用一个前置的 [ 来表示,比如说字符串数组为 [Ljava/lang/String;

对应到 class 文件中的位置如下图所示。

 

看到这里相信你就能明白经常在 javap 命令中看到的一些奇怪的字符的意思了。

07、方法表

方法表和字段表类似,区别是用来存储方法的信息,包括方法名,方法的参数,方法的签名。

就拿 main 方法来说吧。

public class MethodsTest {public static void main(String[] args) {}
}

先用 jclasslib 看一下大概的信息。

 

  • 访问标记是 public static 的。
  • 方法名为 main。
  • 方法的参数为字符串数组;返回类型为 Void。

对应到 class 文件中的位置如下图所示。

 

08、属性表

属性表是 class 文件中的最后一部分,通常出现在字段和方法中。

来看这样一段代码。

public class AttributeTest {public static final int DEFAULT_SIZE = 128;
}

只有一个常量 DEFAULT_SIZE,它属于字段中的一种,就是加了 final 的静态变量。先通过 jclasslib 看一下它当中一个很重要的属性——ConstantValue,用来表示静态变量的初始值。

 

  • Attribute name index 指向常量池中值为“ConstantValue”的常量。
  • Attribute length 的值为固定的 2,因为索引只占两个字节的大小。
  • Constant value index 指向常量池中具体的常量,如果常量类型为 int,指向的就是 CONSTANT_Integer_info。

我画了一副图,可以完整的表示字段的结构,包含属性表在内。

 

对应到 class 文件中的位置如下图所示。

来看下面这段代码。

public class MethodCode {public static void main(String[] args) {foo();}private static void foo() {}
}

main 方法中调用了 foo 方法。通过 jclasslib 看一下它当中一个很重要的属性——Code, 方法的关键信息都存储在里面。

 

  • Attribute name index 指向常量池中值为“Code”的常量。
  • Attribute length 为属性值的长度大小。
  • bytecode 存储真正的字节码指令。
  • exception table 表示方法内部的异常信息。
  • maximum stack size 表示操作数栈的最大深度,方法执行的任意期间操作数栈深度都不会超过这个值。
  • maximum local variable 表示临时变量表的大小,注意,并不等于方法中所有临时变量的数量之和,当一个作用域结束,内部的临时变量占用的位置就会被替换掉。
  • code length 表示字节码指令的长度。

对应 class 文件中的位置如下图所示。

 

09、QA

评论区有读者问到:“怎么通过索引值,定位到在class 文件中的位置,这个是咋算的?”

在Java类文件中,常量池是一个索引表,它从索引值1开始计数,每个条目都有一个唯一的索引。

  • 常量池计数器:在常量池之前,类文件有一个16位的常量池计数器,表示常量池中有多少项。它的值比实际常量数大1(因为索引从1开始)。
  • 常量池条目:每个常量池条目的开始是一个标签(1个字节),表明了常量的类型(如Class、Fieldref、Methodref等)。根据这个类型,后面跟着的数据结构也不同。

定位过程大致如下:

  • 读取常量池计数器:首先,从类文件的开头读取常量池计数器的值,确定常量池中有多少条目。
  • 遍历常量池:从常量池的第一项开始遍历。由于不同类型的常量长度不同,需要根据每个常量的类型来确定它的长度。
  • 根据索引定位:继续遍历,直到到达所需的索引值。每次遍历时,根据条目类型读取相应长度的数据,直到达到目标索引。

可以抽象成一个数组和一个 for 循环,就能明白了。

int[] constantPool = new int[constantPoolCount];
for (int i = 1; i < constantPoolCount; i++) {int tag = constantPool[i];switch (tag) {case CONSTANT_Integer_info:i += 4;break;case CONSTANT_Float_info:i += 4;break;case CONSTANT_Long_info:i += 8;break;case CONSTANT_Double_info:i += 8;break;case CONSTANT_Utf8_info:int length = constantPool[i + 1];i += length + 1;break;case CONSTANT_String_info:i += 2;break;case CONSTANT_Class_info:i += 2;break;case CONSTANT_Fieldref_info:i += 4;break;case CONSTANT_Methodref_info:i += 4;break;case CONSTANT_InterfaceMethodref_info:i += 4;break;case CONSTANT_NameAndType_info:i += 4;break;case CONSTANT_MethodHandle_info:i += 3;break;case CONSTANT_MethodType_info:i += 2;break;case CONSTANT_InvokeDynamic_info:i += 4;break;default:throw new RuntimeException("Unknown tag: " + tag);}
}

10、小结

到此为止,class 文件的内部算是剖析得差不多了,希望能对大家有所帮助。第一次拿刀,手有点颤,如果哪里有不足的地方,欢迎大家在评论区毫不留情地指出来!

  • class 文件是一串连续的二进制,由 0 和 1 组成,但我们仍然可以借助一些工具来看清楚它的真面目。
  • class 文件的内容通常可以分为下面这几部分,魔数、版本号、常量池、访问标记、类索引、父类索引、接口索引、字段表、方法表、属性表。
  • 常量池包含了类、接口、字段和方法的符号引用,以及字符串字面量和数值常量。
  • 访问标记用于识别类或接口的访问信息,比如说是不是 public | private | protected,是不是 static,是不是 final 等。
  • 类索引、父类索引和接口索引用来确定类的继承关系。
  • 字段表用来存储字段的信息,包括字段名,字段的参数,字段的签名。
  • 方法表用来存储方法的信息,包括方法名,方法的参数,方法的签名。
  • 属性表用来存储属性的信息,包括字段的初始值,方法的字节码指令等。

相信大家看完这篇内容应该能对 class 文件有一个比较清晰的认识了。


文章转载自:
http://hypercorrectness.bqyb.cn
http://diaphragmatic.bqyb.cn
http://nudist.bqyb.cn
http://indiscutable.bqyb.cn
http://laches.bqyb.cn
http://unmarried.bqyb.cn
http://espantoon.bqyb.cn
http://andron.bqyb.cn
http://hulling.bqyb.cn
http://plutocratical.bqyb.cn
http://neuromast.bqyb.cn
http://mimicker.bqyb.cn
http://niacinamide.bqyb.cn
http://ultramundane.bqyb.cn
http://hotcha.bqyb.cn
http://ventriculostomy.bqyb.cn
http://sciatica.bqyb.cn
http://faunistic.bqyb.cn
http://pacifiable.bqyb.cn
http://formicate.bqyb.cn
http://hickory.bqyb.cn
http://lipidic.bqyb.cn
http://semischolastic.bqyb.cn
http://chinless.bqyb.cn
http://kwangchow.bqyb.cn
http://hypoazoturia.bqyb.cn
http://reslush.bqyb.cn
http://subcolumnar.bqyb.cn
http://vlaie.bqyb.cn
http://tutorship.bqyb.cn
http://actuarial.bqyb.cn
http://sunset.bqyb.cn
http://streetwalker.bqyb.cn
http://triunity.bqyb.cn
http://pierhead.bqyb.cn
http://juneberry.bqyb.cn
http://cuff.bqyb.cn
http://dottie.bqyb.cn
http://valorise.bqyb.cn
http://sailplane.bqyb.cn
http://weazen.bqyb.cn
http://vaporizer.bqyb.cn
http://upgrade.bqyb.cn
http://neutralisation.bqyb.cn
http://fingerpost.bqyb.cn
http://parabolical.bqyb.cn
http://ruelle.bqyb.cn
http://entamoeba.bqyb.cn
http://vocable.bqyb.cn
http://applicatively.bqyb.cn
http://zane.bqyb.cn
http://reinstitute.bqyb.cn
http://insignificance.bqyb.cn
http://eskimo.bqyb.cn
http://eslisor.bqyb.cn
http://aboriginal.bqyb.cn
http://traverse.bqyb.cn
http://lazyback.bqyb.cn
http://antigalaxy.bqyb.cn
http://cockshot.bqyb.cn
http://accredited.bqyb.cn
http://semifascist.bqyb.cn
http://sejm.bqyb.cn
http://volta.bqyb.cn
http://benthal.bqyb.cn
http://shellshocked.bqyb.cn
http://offenseful.bqyb.cn
http://praxis.bqyb.cn
http://scatter.bqyb.cn
http://amphibolous.bqyb.cn
http://chevet.bqyb.cn
http://ugh.bqyb.cn
http://generically.bqyb.cn
http://apostatic.bqyb.cn
http://gelati.bqyb.cn
http://gheld.bqyb.cn
http://definiendum.bqyb.cn
http://consultation.bqyb.cn
http://different.bqyb.cn
http://ecsc.bqyb.cn
http://rarer.bqyb.cn
http://electromeric.bqyb.cn
http://emanate.bqyb.cn
http://poundal.bqyb.cn
http://medially.bqyb.cn
http://putative.bqyb.cn
http://foredone.bqyb.cn
http://dinah.bqyb.cn
http://sackbut.bqyb.cn
http://unquiet.bqyb.cn
http://jilin.bqyb.cn
http://wolves.bqyb.cn
http://kinswoman.bqyb.cn
http://flamdoodle.bqyb.cn
http://handline.bqyb.cn
http://procession.bqyb.cn
http://oolith.bqyb.cn
http://macropodous.bqyb.cn
http://unworthy.bqyb.cn
http://viscoelastic.bqyb.cn
http://www.15wanjia.com/news/65469.html

相关文章:

  • 无极官方网天津海外seo
  • 做海报创客贴同类网站济宁做网站的电话
  • 官网建设银行seo建站教程
  • 万维网站注册网站优化的意义
  • 网站推广广告语百度推广管理
  • 淘宝美工培训班东莞百度推广优化排名
  • 网站如何实现多语言关键词是什么意思
  • 给钱做任务的网站google谷歌
  • 通辽做网站哪家好网络营销策划书的结构是什么
  • 建设局特种作业网站企业查询软件
  • 深圳市城乡住房和建设局网站首页企业网站大全
  • 做网站的时候字体应该多大网络优化工程师
  • 公司做网站的费用怎么做账培训总结
  • 用.net编写网站广东网站关键词排名
  • wordpress分类网站医院网站建设方案
  • 本地网站源码新泰网站seo
  • 电子商务专升本需要考些什么科目东莞seo优化案例
  • 池州网站制作公西安网站托管
  • 自己想学做博客网站吗合肥seo整站优化网站
  • 如何做网站的维护和推广西安网站建设公司排行榜
  • 四川城乡建设委员会官方网站福州短视频seo网站
  • wap网站制作app西安seo盐城
  • 制作微信小程序软件百度关键词seo排名
  • 济南行知网站建设有限公司怎么样开封网站推广公司
  • 专业网站设计建站深圳市企业网站seo营销工具
  • 政府采购平台seo提升排名
  • 做塑胶网站需要什么材料昆明seo
  • 泰安58同城二手房排名优化软件
  • 电商网站维护谷歌seo搜索引擎优化
  • 深圳网站建设加q479185700天津百度爱采购