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)怎么去理解,一台电脑利用一个外壳包裹,保护了里面的电器元件,提供了少量的按键与其对接使用。我要看电视,只需要按一下开关和换台就可以了。有必要了解…

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

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

[2-sat]HDOJ3062 Party

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

Winodws live writer

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

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

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

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

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

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

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

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

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

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

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

python 定义变量_第三章(第2节):变量和常量

变量的概念基本上和初中代数的方程变量是一致的,只是在计算机程序中,变量不仅可以是数字,还可以是任意数据类型,比如我们上节课刚刚学过的基本数据类型或者我们后面要学的自定义数据类型。所谓常量就是不能改变的变量,…

pytorch卷积神经网络_资源|卷积神经网络迁移学习pytorch实战推荐

点击上方“AI遇见机器学习”,选择“星标”公众号重磅干货,第一时间送达一、资源简介这次给大家推荐一篇关于卷积神经网络迁移学习的实战资料,卷积神经网络迁移学习简单的讲就是将一个在数据集上训练好的卷积神经网络模型通过简单的调整快速移…

php 删除服务器上的文件,php如何删除服务器文件

在php中可以使用“ftp_delete”函数删除服务器文件,其语法是“ftp_delete(ftp_connection,file)”,参数“ftp_connection”表示要使用的FTP连接,参数“file”表示要删除的文件的路径。推荐:《PHP视频教程》PHP ftp_delete() 函数定…

java class load 类加载

1:what is it jvm把描述类的数据从class字节码文件加载到内存,并对数据进行校验、解析、初始化,最终成为jvm直接使用的数据类型 1、ClassNotFoundExcetpion   我们在开发中,经常可以遇见java.lang.ClassNotFoundExcetpion这个异常&#xf…

debian执行php网页,如何在Debian上安装和使用PHP Composer

php composer是一个包管理工具,它消除了手动维护应用程序的PHP包的麻烦,可以使用composer轻松安装所有必需的包。本篇文章将介绍在Debian系统上安装和配置PHP Composer的方法。1、条件shell使用sudo权限访问正在运行的debian系统。必须安装和配置5.3或更…

JAVA_if或者怎么用,Java If语句

Java教程 - Java If语句Java if语句用于根据条件执行一个代码块。Java If语句下面是Java if语句的最简单形式:if(condition)statement;condition是一个布尔表达式。如果condition是true那么执行语句。如果condition是false,那么绕过语句。以下代码根据an的值输出消息…

iOS开发——高级技术本地化与国际化详解

本地化与国际化详解效果如下:英语: 中文: 具体实现如下:一。先做准备:设置程序本地化在xcode点击程序图标…

Matlab经纬度坐标转换xy坐标,经纬度坐标系转换为UTM坐标系(matlab)

如题所说,直接上程序。验证自己做一下,结果应该是对的。诚不我欺。(注意:程序名与函数名保持一致!!!)function[shuchu]lat_lon2utm(lat_shuru,lon_shuru)%地理经纬度坐标转换为UTM坐标size_shuzusize(lat_s…

matlab空间曲面拟合,matlab如何进行曲面拟合

matlab如何进行曲面拟合以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!在一丘陵地带测量高程,x和 y方向每隔100米测一个点,得高程如下表,试插值一曲面&am…

treegrid.bootstrap使用说明

treegrid.bootstrap使用说明 这个插件是用来做有层次的表格的,大概如图: 官网 http://maxazan.github.io/jquery-treegrid/ 使用这个控件之前需要引入以下css及js(因为用到了 bootstrap.js 所以加上了 bootstrap的样式和脚本) bo…

matlab 条形图横坐标,Matlab条形图bar横坐标间距设置

1. 默认横坐标数据 X[x1, x2, x3, x4, x5, x6] %一行六列bar(X); %绘制基础条形图2. 修改横坐标标签#考虑横坐标标签文本较长且字体较大的情况bar(X);set(gca, xticklabels,{Apple, Orange, Banana, Pear, Pitaya, Lemon}, Fontname, Times New Roman, Fontsize, 16); %修…