- 浏览: 182155 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
yangmo:
你好,求指教!QQ:3174968226
android利用mathjax在webview上显示数学公式 -
freezingsky:
越看越觉得,这真是吊丝的宿命。。。
今天我是个幸运儿 -
greemranqq:
~.~ 10W啊,看来LZ 还是坚持 呆下来了 加油
今天我是个幸运儿 -
flashing:
good luck!
今天我是个幸运儿 -
gy090028:
为什么我输入错误的密码都返回true呢。。。
登陆163邮箱 验证邮箱帐号密码是否正确
class文件就是java源文件编译的生成的文件。废话不多说,我们通过一个实例来解析.class文件的构成吧。
写一个测试类,代码如下:public final class TestClass {
public int id =123 ; private String name="中国人"; public void test() { int a=1; int b=2; int c=a+b; String str=name+"最伟大"; System.out.println(str); } }
Javac 后生成的class文件如下:
对应的解析结果如下:
magic number = 0xCAFEBABE -----标准class文件
Version = 50.0
constant pool size = 49
#1 10 Methodref classIndex@13, nameAndType @25
#2 9 Fieldref classIndex@12,nameAndTypeIndex@ 26
#3 8 StringIndex @27
#4 9 Fieldref classIndex@12,nameAndTypeIndex@ 28
#5 7 classIndex @29
#6 10 Methodref classIndex@5, nameAndType @25
#7 10 Methodref classIndex@5, nameAndType @30
#8 8 StringIndex @31
#9 10 Methodref classIndex@5, nameAndType @32
#10 9 Fieldref classIndex@33,nameAndTypeIndex@ 34
#11 10 Methodref classIndex@35, nameAndType @36
#12 7 classIndex @37
#13 7 classIndex @38
#14 1 Utf8 id
#15 1 Utf8 I
#16 1 Utf8 name
#17 1 Utf8 Ljava/lang/String;
#18 1 Utf8 <init>
#19 1 Utf8 ()V
#20 1 Utf8 Code
#21 1 Utf8 LineNumberTable
#22 1 Utf8 test
#23 1 Utf8 SourceFile
#24 1 Utf8 TestClass.java
#25 12 NameAndType name@18, descripter@19
#26 12 NameAndType name@14, descripter@15
#27 1 Utf8 涓浗浜?
#28 12 NameAndType name@16, descripter@17
#29 1 Utf8 java/lang/StringBuilder
#30 12 NameAndType name@39, descripter@40
#31 1 Utf8 鏈?紵澶?
#32 12 NameAndType name@41, descripter@42
#33 7 classIndex @43
#34 12 NameAndType name@44, descripter@45
#35 7 classIndex @46
#36 12 NameAndType name@47, descripter@48
#37 1 Utf8 TestClass
#38 1 Utf8 java/lang/Object
#39 1 Utf8 append
#40 1 Utf8 (Ljava/lang/String;)Ljava/lang/StringBuilder;
#41 1 Utf8 toString
#42 1 Utf8 ()Ljava/lang/String;
#43 1 Utf8 java/lang/System
#44 1 Utf8 out
#45 1 Utf8 Ljava/io/PrintStream;
#46 1 Utf8 java/io/PrintStream
#47 1 Utf8 println
#48 1 Utf8 (Ljava/lang/String;)V
access_flags = 49 [public final ]
This class = 12
Super class = 13
下面我详细讲解一下上面的结果和十六进制的图的对应关系
上面的图有红线和蓝线。意思是一样的,交替使用是为了在换行识别的连续性。
<!--EndFragment-->
下面我详细讲解一下上面的结果和十六进制的图的对应关系
上面的图有红线和蓝线。意思是一样的,交替使用是为了在换行识别的连续性。
Class File format |
||
type |
descriptor |
remark |
u4 |
magic |
0xCAFEBABE |
u2 |
minor_version |
|
u2 |
major_version |
|
u2 |
constant_pool_count |
|
cp_info |
constant_pool[cosntant_pool_count – 1] |
index 0 is invalid |
u2 |
access_flags |
|
u2 |
this_class |
|
u2 |
super_class |
|
u2 |
interfaces_count |
|
u2 |
interfaces[interfaces_count] |
|
u2 |
|
|
field_info |
fields[fields_count] |
|
u2 |
methods_count |
|
method_info |
methods[methods_count] |
|
u2 |
attributes_count |
|
attribute_info |
attributes[attributes_count] |
|
第一排:[CA FE BA BE 表示魔数: 0xCAFEBABE],[00 00表示次版本号:0],[00 32表示主版本号:50 ] [00 31 表示常量池个数:49],后面就是常量池里面具体的值了.示例性的讲2个吧。[0A tag表示常量类型为10(Methodref),tag枚举见附,00 0D表示class_index,他在常量池的第13个,也就是java/lang/Object]
在第1f0h行常量池结束。常量池后面是
[00 31,表示access_flags:49,意思是该类是public,final],
[00 0C表示this_class,常量池第12个即TestClass],
[00 0D表示super_class,常量池第13个, 表示java/lang/Object],
[00 00表示接口个数为0],
[00 02表示fields_count为2,有两个字段。后面就是对两个字段进行描述]
[00 01 00 0E 00 0F 00 00 分别表示: 00 01字段为public,00 0E表示字段名在常量池第14个,即id,00 0F表示字段描述符I,即int型, 00 00表示属性的个数,他没有所以为0]
[00 02 00 10 00 11 00 00 分别表示:00 02字段修辞符为private,00 10表示字段名在常量池第16个,查为:name,00 11表示字段类型在常量池第17个即:Ljava/lang/String;,00 00表示属性个数为0]
[00 02表示方法个数为2,后面就是详情的方法]
直到240h红线处是该类的构造方法。红线开始是test()方法
直到2a0h红线处方法结束
后面是性属。最后一排01和上排末00表示属性长度为1,后面00 17表示23表示属性的字符串常量在常量池的位置,即SourceFile。表示该属性为源文件。长度为00 02,根据JVM规范,这个值永远为2.具体原因不清楚。最后的00 18表示文件名在常量池的位置为24,即TestClass.java
好了,解析完了。这是通过实战让大家了解class文件的结构。理论参考:http://408036296.blog.163.com/blog/static/1688515020118685836314/?latestBlog
附上tag数据类型:
tag中表示的数据类型:
CONSTANT_Class_info (7)、
CONSTANT_Integer_info (3)、
CONSTANT_Long_info (5)、
CONSTANT_Float_info (4)、
CONSTANT_Double_info (6)、
CONSTANT_String_info (8)、
CONSTANT_Fieldref_info (9)、
CONSTANT_Methodref_info (10)、
CONSTANT_InterfaceMethodref_info (11)、
CONSTANT_NameAndType_info (12)、
CONSTANT_Utf8_info (1)、
发表评论
-
JAVA内存分配规则
2013-11-05 09:14 887*对象分配规则 1.对象 ... -
java的类加载需要注意的点--非大众版
2013-10-15 23:14 0本文不是通俗的讲JAVA类加载原理,这种文章网上一找一大把。大 ... -
实用简约的JAVA注释标签-高手必备
2013-10-15 22:37 7373大家在开发中写JAVA注释谁都会,不会一般写得少或者 ... -
java类加载先后顺序
2013-10-14 21:25 3608这里讲的不是类加载机制,是类的加载先后顺序。话不多说了,先 ... -
断点续传原理
2013-09-06 00:14 1610(一)断点续传的原理其 ... -
log4j,logback,slf4j三者的关系
2013-09-05 23:32 8640Log4j由三个重要的组件构成:日志信息的优先级,日志信息的 ... -
安全漏洞预警公告-Struts2存在远程命令执行漏洞 --终极解决方案
2013-07-18 10:16 2403struts2支持url?action:%{ognl exp ... -
将异常信息保存到String
2013-07-18 10:13 1131将异常信息保存到String中: private Stri ... -
无法定位程序输入点_JVM_SetNativeThreadName@12于动态链接库jvm.dll上
2013-06-29 15:40 3154系统提示升级jdk7,升级途中中断后来在运行JAVA就报:无法 ... -
struts2参数名支持任意字符
2013-06-18 18:09 2142struts2在传参数时会对参数名进行校瓮。默认的校验器只支 ... -
用Spring类读XML等文件
2013-06-16 22:04 0Java代码 String file ... -
登陆163邮箱 验证邮箱帐号密码是否正确
2013-06-16 22:02 3606有些时候我们只需要验证邮箱的帐号密码是否正确。而不需要发邮件 ... -
java去除字符串中的空格、回车、换行符、制表符 \r \n
2013-05-31 11:12 1428public static String replaceB ... -
第17章 线程和锁
2013-04-28 00:13 901工作之余翻译oracle官 ... -
随机数生成算法
2013-04-12 23:09 2874chrome 有很多场景我们需要产生随机数。一般是采用线性同 ... -
ThreadPoolExecutor对线程的管理
2013-03-26 13:37 753rfffff -
JMXtools的扩展
2013-01-11 10:20 2793大家都知道jmx的功能,一般都是使用三方包jmxtools.j ... -
JAVAC编译JAVA源文件
2013-01-10 09:34 1144大家都知道用javac命令可以编译java源文件,具体大家可以 ... -
Implicit super constructor SimpleJavaFileObject() is undefined for default const
2013-01-09 21:26 2129今天在引入rt.jar下包的一个类javax.tools.Si ... -
将Object转换成动态指定的对象,将一个实例引用指向一个Object引用
2013-01-08 22:48 1175将Object转换成动态指定的对象,换句话说将一个实例引用指向 ...
相关推荐
基于Go的Java Class文件解析工具
java语言实现的class文件解析,让你明白class文件中到底都有些什么东西。
class文件变java源代码,可同时打开多个文件,关键字高亮显示
class文件解析器class文件解析器class文件解析器
一个简单的分析工具,用于分析”.class/.cap/.exp”格式的Java文件。 对于CAP文件,支持version 2.1 and 2.2. 适用于JCVM的学习。 使用工具时,需保证“C:\Program Files\WinZip\WINZIP32.EXE”存在,用于解压CAP...
python实现的简单的class解析以及简单执行class,使用python2解析java class文件,并简单执行 class,让大家更加了解class
Java 代码解析 class 文件
一个解析java class文件的代码
最近在拜读《深入理解java虚拟机》,根据书上的步骤来解析class文件,并提供了对应的样例数据分析,利于读者阅读
java Class文件分析及其解析执行是分析JVM的重要部分,通过实例对Class文件的结构进行了详细分析,并初步实现了Class文件的解析执行。
* 功能:Java读取txt文件的内容 * 步骤:1:先获得文件句柄 * 2:获得文件句柄当做是输入一个字节码流,需要对这个输入流进行读取 * 3:读取到输入流后,需要读取生成字节流 * 4:一行一行的输出。readline...
JavaClassViewer-2.0.4, 用于理解Class文件结构。 解析出class结构,以及十六进制的表示,特别方便。 原下载地址: http://www.softpedia.com/get/Programming/File-Editors/Java-Class-Viewer.shtml。另外也可以参考...
class文件全名称为Java class文件,主要在平台无关性和网络移动性方面使Java更适合网络。它在平台无关性方面的任务是:为Java程序提供独立于底层主机平台的二进制形式的服务。下面我们来详细解读下它吧
java class的文件结构,java class文件结构是基于字节流的,用unicode进行编码,下面说说java Class文件内部结构分析
java以其跨平台、免费、安全等特点,被越来越多的应用到大型的系统中。正是由于其代码的跨平台性,是解析型语言才使得它很容易被反编译成源码,从而造成公司代码的泄露,设置时运用框架的泄露。本文从各个方面介绍了...
利用java的反射解析Properties文件转成对象 /** * 解析properties文件为对象 * @param * @param propPath * @param cls * @return * @throws InstantiationException * @throws ...
JVM之用Java解析class文件共10页.pdf.zip
这是我在编写struts2中遇到的问题,整理出来,包括截图,希望可以帮到大家