`
- 浏览:
74191 次
- 性别:
- 来自:
杭州
-
一.问题的提出
我们看看JAVA的CLASS文件,发现这个文件的结构非常严谨,首先是魔数,魔数表明这个文件到底是不是JAVA翻译过来的CLASS文件,其实就是文件格式的表示,接下来就是JAVA的次版本号和主版本号,那么紧接着这个版本号就是常量区,常量区的第一个和第二个字节表示这个常量区中有多少个常量,今天使用vi编辑器打开一个class文件,然后%!xxd以二进制的方式查看,发现这个class文件的常量区开头有0x0057个常量,也就是说有87个常量,然后我使用javap -verbose反编译之后发现常量区中只有86个常量,少了一个常量,这怎么解释呢?
二.问题的解决
其实这个问题是自己最近在用JAVA程序解析CLASS文件的时候遇到的,带着这个疑问,我自己跑了一遍自己的解析程序,发现在解析常量区的时候,解析出来的常量数目也是比实际的常量数目少一个,这是程序跑出来的现像。
CLASS文件中常量区包含很多常量,这些常量有自己的数据结构,总共有11种常量数据结构,每种数据结构都有一个共同的字段tag,tag的取值是[1,3,4,5,6,7,8,9,10,11,12],很明显缺少了0和2,这里为什么不用2我也不清楚,这里0存在的意义就是为了满足后面某些指向常量池的索引值的数据在特定情况下需要表达"不引用任何一个常量池项目"的意思。但是这里的2怎么解释我至今也没弄清楚。所以87个常量是从1到86,和我们程序中的数组下标有点不一致,数组下标是从0开始的,而这里的常量索引是从1开始的,二者都不包含最后一个。
三.最后结论
如果我们通过分析CLASS文件的二进制形式,发现常量区有N个常量,那么使用javap反编译出来的结果中只有N-1个常量,在常量池中,这N-1常量的索引从1到N-1
- 大小: 15.7 KB
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
java字节码加密
java字节码反编译工具 JAD+FrontEnd
Java字节码分析工具,系统分析了java字节码文件,即java class类文件,对该文件中的各种成分以树的形式描述出来,只能针对未加密的class文件,一般由标准java编译器编译生成的class文件都未加密,该系统在vs2003下面...
轻松看懂Java字节码,对java字节码的详细分析,理解java字节码
Java字节码优化框架
我测试了一个前端时间开发的一个网络通讯工具,其中用到了很多java15的特性,例如泛形,增强循环,静态引入等功能,以及jdk15独有的类文件,例如StringBuilder等。通过该工具进行转换,可以完美的运行在java14环境...
基于Java字节码的混淆技术研究 基于Java字节码的混淆技术研究
关于java字节码的开源介绍,可以参考来吧 关于java字节码的开源介绍,可以参考来吧
Java字节码简单说明
Java 字节码概述ppt说明文档,欢迎交流
JAVA字节码JAVA字节码
查看编辑class文件,可查看操作字节码bytecode指令
javassist, Java字节码工程工具包 Java字节码工程工具包 版本 3版权所有( C ) 1999 -2017按 Shigeru Chiba,保留所有权利。Javassist ( Java编程助手) 使Java字节码操作简单。 它是一个类库,用于在Java中编辑字节码
jclasslib是一款免费开源的java字节码查看工具,该软件不但可以查看java字节码,同时还包含一个类库允许开发者读取,修改,写入Java Class文件与字节码。简单的说:用户可以通过jclasslib修改jar包下面的类,是一个...
jclasslib是一款免费开源的java字节码查看工具,该软件不但可以查看java字节码,同时还包含一个类库允许开发者读取,修改,写入Java Class文件与字节码。简单的说:用户可以通过jclasslib修改jar包下面的类,是一个...
当Java源文件被编译后,就会生成Class字节码文件。 Class常量池就存在于Class文件中(Class文件的Constant Pool中)。 Class文件常量池主要存放两大常量:字面量和符号引用。 字面量: 字面量分为文本字符串(如: "abc...
jd-gui java字节码反编译 class反编译 jd-gui java字节码反编译 class反编译
Java Bytecode Editor是修改和分析java字节码结构和类文件的有效工具:下载解压后,双击jbe. bat(Windows)或jbe.sh(Linux)即可运行JBE。src目录下的是JBE的源码。
优秀的Java字节码可视化编辑工具,使用方便上手简单。
JAVA字节码操作库 BCEL