java实体字节属性定义_Java字节码方法表与属性表详解

ad44733c37c7bdae4113d2bcc8a29730.png

cd3e77fef63920ba60e2dc49ec7c206f.png

而这些字节其实对应的信息是它:

9031e60dab036d2b8a699e37f912e9e2.png

所以问题就来了,aload_0不是助记符信息么,怎么就能够跟字节码文件中的字节对应上呢?所谓助记符其实也就是帮忙我们去记忆的符合,在底层其实也是对应的一个个十六进制的数字的,其它aload_0对应的就是2A这个十六进制数字,凭什么这么说?因为有jclasslib这么好的工具能帮我们对应上,将鼠标放在助记符上发现是一个可以点的链接,如下:

11b9c8666c0c9d0b5d653a0b0ac963ca.gif

点一下“aload_0”发现居然链到了oracle的官网上的说明上去了,如下:

f5d018243114f8ddd9194e18a610505c.png

a3a81fd61470b76e18a33238e97821f6.png

a68ed4fb9487c6938471acfd19b4717b.png

所以第一个字节已经分析完了,确实是跟助记符对应上了,接着来分析第二个字节:

64d8050a54a04e8a346e8c6798af1fa6.png

而在jsclasslib中对应的第二个助记符是“invokespecial”,点击链到官网看一下:

0ee5bfb78dce67c67ceca08a89b76e57.png

而它的作用可以理解成就是调用父类的方法,很明显对于咱们自定义的子类肯定会去调用父类的构造方法,而这个助记符是有参数的:

4a54893c23bbec5d3b9f08ea932924d8.png

其实也就是往后的两个字节就是该助记符所对应的参数,如下:

f2feecf0b3ea0da3dee0d7fd4f747c1a.png

对应常量池为:

888bb45cb5466d64be0e59f24417c77d.png

也就是构造方法嘛,如jsclasslib所示:

1151a674ed8d5ce7702b1a53f37342df.png

接下来继续往下走一个字节:

30b5ce9193480db4867eeb4d23a7276f.png

又对应aload_0,如下:

63a4323059f4c68ed22fc8ef6291c7df.png

接着再往后看一个字节:

3e39116d1c009ade07b142661678d4f0.png

其实它就是对应下一个助记符,如下:

db1157dabc50ef66a2ec3a5c55b48ba0.png

为啥如此任性呢,因为点击查看一下说明就晓了啦:

228592e6c9c70984a974ed9af1b2e4af.png

为啥要push一个1呢?实际就是给咱们定义的成员变量a赋值,如下:

b3bdd84501a80ef23274bcf973fa083b.png

可见,该变量的赋值是在默认构造函数中进行的,而不是直接进行赋值的,这也就是分析字节码文件的好处,可以更加真实的发现底层细节。

接下来再数一个字节:

91e6a686d64bbe4590ca009c2d628e33.png

当然它又对应另一个助记符喽,如下:

ae642a40122ed77dcb0ed1b84f089296.png

点击看一下官网说明:

a64c09599da05c33f26f59fc23b49dab.png

接下来该助记符是携带有参数的,所以再往后数两个字节:

d724004e7787012dc415394903da04f1.png

对应常量池:

e46a63810c8b954e827ab0d9e9a66d73.png

也就是给MyTest1的成员变量a赋值为1。

接下来再数一个字节:

e210718d86618e0631bf128803708dc8.png

对应于如下助记符:

264ba0a7aff88ff235581fc295011e8a.png

点击确认一下:

6ffa6da5d644dcc460c75f7606f055fb.png

至此整个构造方法就已经执行完了。发现通过分析字节码也能获得不少新知识嘛,仅通过这个构造函数的执行流程就能知道了对于我们定义的成员变量原来是在构造方法中进行赋值而非直接赋值的,还是挺有价值的。

好,方法的code分析完之后,则就得往下进行分析了,先来查看一下结构类型:

3da7b9fa3630d9bfc3596c54e4d26a71.png

也就是再数两个字节,看一下:

596c37a557943d1c49ec28b4b33c6566.png

说明该方法木有异常信息,所以接下来的异常表就不会显示在字节文件当中了:

ccd8c2ea858e10c97bd3dd174a2fc46e.png

其中关于异常还需解释一下:

exception_table,这里存放的是处理异常的信息。

每个exception_table表项由start_pc、end_pc、handler_pc、catch_type组成。

start_pc和end_pc表示在code数组中的从start_pc到end_pc处(包含start_pc,不包含end_pc)的指令抛出的异常会由这个表项来处理。

handler_pc表示处理异常的代码的开始处。catch_type表示会处理的异常类型,它指向常量池里的一个异常类。当catch_type为0时,表示处理所有的异常。

接下来就到属性相关的东东了,如下:

085aeb579f1363695fe79846526b749b.png

所以往下数2个字节:

0e8876357136deb9bdd7b95921cf2200.png

说明该方法有两个属性,往下数两个字节则是第一个属性的名字索引,如下:

4673590f0fd821fa780251d462c093f8.png

也就是对应第10的常量池,为:

03c74e7ca02c254789f86f5d9d50284d.png

该属性用来表示code数组中的字节码和Java代码行数之间的关系。这个属性可以用来在调试的时候定位代码执行的行数。而该属性的结构为:

152c6f66ba2403b7ec26435db89c52aa.png

其中attribute_name_index就是常量索引10,接下来数4个字节则是属性的长度attribute_length,如下:

8956615770bb4db94685ff0daa5ccee9.png

也就是属性的长度为10,也就是接下来10个字节则为LineNumberTable的属性信息,如下:

6510d1446f11466747653a594241e886.png

看一下jclasslib:

4cc43b2f95970ee7c504ec8b6fc904d2.png

下面具体来分析一下这10个字节,根据结构体来看:

e7de21421deeab113194dd857d31237e.png

先2个字节表示属性表有几对映射,如下:

965b7ecdd3092e6c258f663ab898bea7.png

说明有两对映射,然后再回到结构体中,每对映射的内容为:

56306f6e48b5e210aa12c34b45a3e9a5.png

每对占4个字节,先看第一对映射:

39a9a74eb74c2d09cb55b282b713273c.png

也就是start_pc=0;line_number=3,对应于jclasslib:

ce609208302fcef048ec74841ee815a5.png

由于咱们源代码木有构造方法,所以字节码对应源代码就在第3行,如下:

aa2521f357b011570d57477f94fa5092.png

接下来看第二对映射:

620a9baabccd73a9be49e9df13b2f408.png

也就是start_pc=4;line_number=4,对应于jclasslib:

c9b04086914f26eac1e8da45ba532981.png

因为成员变量的赋值是在构造方法中完成的,所以对应第4行代码:

d62a29108260b2db174ad92cca95c0a9.png

好,方法的第一个属性已经完了,接下来以同样的顺序来查看方法的第二个属性信息了,走2个字节来看属性名称索引,如下:

919f4aad6897a43b85496c38bed45b3a.png

对应第11个常量池索引,如下:

843cfe7c0696a804ceab3ce6d4d4ecf3.png

它的结构跟LineNumberTable差不多的,往后数四个字节则是局部变量表所占的长度:

8b5212a53f2cf596af58eb6ccdb8c9be.png

329a514af43313077f69743f05bc3036.png

长度为12,如jclasslib所示:

c11b480b75275b8354aa716d3f6c04b5.png

然后往后数12个字节则是局部变量的具体信息,首先两个字节则为局部变量的个数,如下:

07bafe89244669157384e3b8a3499536.png

呃~~构造方法哪来的局部变量呢,好奇怪,先不管先来把其它字节分析完,再往后四个字节表示start_pc和length,如下:

e328d139ff15d1d6459741feae4edd94.png

如jclasslib所示:

c35f2c58f1fb8582e9dc5e146d289163.png

接下来则为局部变量的索引为0,也就是第一个局部变量:

97505d240b5b29fbb67842d0585246a5.png

再往后两个字节则是局部变量对应常量池的索引,如下:

e901b98c8356b335ef270cea2dbef79a.png

8700026b76a01f11b028ff431121363d.png

再接下来两个字节则是对该局部变量的一个描述常量索引,如下:

c09966a6db9b0178db4cdb7e11500814.png

9c85eb0662dbe442a2c9db2165a19c0d.png

所以对应jclasslib中可以看到:

74df4f0f5fd2cb4b34a5ef8f2b5d1e4e.png

那思考一下为啥在构造方法中会有一个this的局部变量呢?我们知道在所有方法中我们都能使用this关键字来访问当前的对象,而从字节层面来讲其实this是作为方法的第一个参数传进来的,也就是说对于Java的一个实例方法而言最少会有一个this的局部变量存在!

还剩最后两个字节则为stackmaptable信息,JDK1.6加入的,主要做校验检查的,因为0嘛所以后面肯定木有相关的信息了,这里就直接忽略,如下:

6b1d99881d0e234f02598ea8d105c4c5.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/431484.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

允许使用抽象类类型 isearchboxinfo 的对象_此对象非彼对象(面向对象)3

java13面向对象深入3大纲这里没有写面向对象-封装性理解封装( encapsulation)怎么去理解,一台电脑利用一个外壳包裹,保护了里面的电器元件,提供了少量的按键与其对接使用。我要看电视,只需要按一下开关和换台就可以了。有必要了解…

python turtle库输出文字_python turtle库学习笔记

#绘制时钟#codingutf-8importturtle as ttfrom datetime import *#当前日期属于一周的第几天defWeek(t):week ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"]returnweek[t.w…

后勤报修项目心得

耗时两天左右,完成了预期任务,来做个总结1.简单说下感受2.说说整个经历3.温习下自己在实战项目操作过程中出现的问题 1.因为之前有过一个礼拜左右时间上手预热项目,果然这样学就是上手快,比起在学校里的课,效率提升了很…

hbase java admin_java连接hbase(一):Admin功能接口表管理

本文hbase版本基于hbase-1.0.0-cdh5.6.1。Admin接口主要操作表创建,删除,列族的增删,表的清空,region的增删,合并操作。import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.hbase.HBaseConfigurat…

复制url直接能跳过验证_python 爬虫如何突破登录验证

我用 python 做爬虫爬过不少数据,比如在 google play 爬应用信息;在 instragram, 500px 爬图片;当然爬虫的作用不止于此,比如定时去某个网站签到,妈妈再也不用担心我忘记签到了这些网站支持游客访问,但要访…

[2-sat]HDOJ3062 Party

中文题 题意略 学2-sat啦啦啦 2-sat就是 矛盾的 ($x、x’$不能同时取) m对人 相互也有限制条件 取出其中n个人 也有可能是把一件东西分成 取/不取 相矛盾的两种情况 (那就要拆点啦~) 取其中n件 做法是 暴力 和 强连通 两种 重点在于建图: 对于x,记 取…

node作为java中间间_node作为中间服务层如何发送请求(发送请求的实现方法详解)...

GET请求:var http require(http);var qs require(querystring);var data {a: 123,time: new Date().getTime()};//这是需要提交的数据var content qs.stringify(data);var options {hostname: 127.0.0.1,port: 10086,path: /pay/pay_callback? content,metho…

python目标识别代码_利用ImageAI库只需几行python代码超简实现目标检测

什么是目标检测目标检测关注图像中特定的物体目标,需要同时解决解决定位(localization) 识别(Recognition)。相比分类,检测给出的是对图片前景和背景的理解,我们需要从背景中分离出感兴趣的目标,并确定这一目标的描述(类别和位置…

Winodws live writer

发布一篇试试。 转载于:https://www.cnblogs.com/DotNetCSharp/p/4742956.html

java里面value_「Java基础知识」Java中包含哪些运算符

原标题:「Java基础知识」Java中包含哪些运算符在Java中包含的运算符有:算数运算符,逻辑运算符,关系运算符等。算数运算符也就是我们平时的加减乘除余等操作:在Java中都是将右边的值赋值给左边,所以一般格式…

三元组法矩阵加法java_计算机视觉学习笔记(2.1)-KNN算法中距离矩阵的计算

本笔记系列以斯坦福大学CS231N课程为大纲,海豚浏览器每周组织一次授课和习题答疑。具体时间地点请见微信公众号黑斑马团队(zero_zebra)和QQ群(142961883)发布。同时课程通过腾讯课堂(百纳公开课)进行视频直播.欢迎参与…

[转]Java常用概念解答

1. 事务是什么? 事务是作为一个逻辑单元执行的一系列操作,一个逻辑工作单元必须有四个属性,称为 ACID(原子性、 一致性、隔离性和持久性)属性,只有这样才能成为一个事务: 原子性 事务必须是原子…

idea maven创建java项目_新版本IntelliJ IDEA 构建maven,并用Maven创建一个web项目(图文教程)...

之前都没试过用maven来管理过项目,但是手动找包导包确实不方便,于是今天用2016版的IDEA进行了maven的初尝试。打开IDEA,创建新项目:然后选择Maven,以及选择自己电脑的jdk:接下来自定义GroupId以及ArtifactI…

Linux 格式化磁盘命令mkfs

linux格式化磁盘命令mkfs指令:mkfs使用权限 : 超级使用者使用方式 : mkfs [-V] [-t fstype] [fs-options] filesys [blocks] [-L Lable]说明 : 建立 linux 档案系统在特定的 partition 上参数 :device : 预备检查的硬盘 partition…

servlet 返回可访问文件_JavaWeb技术(4):Servlet的理解(上)

我们在开发中无时无刻都在与Servlet进行接触,只是因为框架的封装性,我们很少直接地去操作servlet,但再怎么封装,基本的思路都不会变化,变得只是实现的方式,Servlet是什么:网上的回答基本是Servl…

java ldap 分页_具有从属引用的 LDAP 分页查询未正确处理

具有从属引用的 LDAP 分页查询未正确处理09/14/2020本文内容本文提供了一些方法来避免使用从属引用的 LDAP 分页查询未正确处理的问题。原始产品版本: Windows 8原始 KB 编号: 2561166症状你有一个应用程序,使用 ldap_search_ext 或 ldap…

js分家效应

(原创文章,转载请注明出处) 有继承,那么就有分家。让我们看以下例子。 var parents function(){}parents.prototype.money 200;var children function(){}children.prototype new parents();var parent new parents();var ch…

如何设置打印的时候不加上页面链接_excel表格的这10个打印小技巧,办公室财务人员记得收藏...

打印工作表是日常工作中最常见的一个工作,也是Excel在工作中最常用的一个地方,如何做到快速准确地打印文件呢。今天文理会计小编给大家从网上整理了几个打印文件的小技巧。1、打印标题打印的工作表的数据有好多页的时候,为了查看方便&#xf…

java sql objects_第十五章-简书.sql

-- ## 练习1-- 1. 创建一个视图,通过该视图可以查询到工资在2000-5000内并且姓名中包含有A的员工编号,姓名,工资。create or replace view viewSal2k_5kas select empno,ename,sal from empwhere sal between 2000 and 5000and ename like %A…

rabbitmq 拉取消息太慢_面试官:消息队列这些我都要问

作者:mousycodersegmentfault.com/a/1190000021054802消息队列连环炮项目里怎么样使用 MQ 的?为什么要使用消息队列?消息队列有什么优点和缺点?kafka,activemq,rabbitmq,rocketmq 都有什么去呗?如何保证消息队列高可用…