- 浏览: 186917 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
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 931*对象分配规则 1.对象 ... -
java的类加载需要注意的点--非大众版
2013-10-15 23:14 0本文不是通俗的讲JAVA类加载原理,这种文章网上一找一大把。大 ... -
实用简约的JAVA注释标签-高手必备
2013-10-15 22:37 7457大家在开发中写JAVA注释谁都会,不会一般写得少或者 ... -
java类加载先后顺序
2013-10-14 21:25 3673这里讲的不是类加载机制,是类的加载先后顺序。话不多说了,先 ... -
断点续传原理
2013-09-06 00:14 1668(一)断点续传的原理其 ... -
log4j,logback,slf4j三者的关系
2013-09-05 23:32 8703Log4j由三个重要的组件构成:日志信息的优先级,日志信息的 ... -
安全漏洞预警公告-Struts2存在远程命令执行漏洞 --终极解决方案
2013-07-18 10:16 2447struts2支持url?action:%{ognl exp ... -
将异常信息保存到String
2013-07-18 10:13 1170将异常信息保存到String中: private Stri ... -
无法定位程序输入点_JVM_SetNativeThreadName@12于动态链接库jvm.dll上
2013-06-29 15:40 3219系统提示升级jdk7,升级途中中断后来在运行JAVA就报:无法 ... -
struts2参数名支持任意字符
2013-06-18 18:09 2183struts2在传参数时会对参数名进行校瓮。默认的校验器只支 ... -
用Spring类读XML等文件
2013-06-16 22:04 0Java代码 String file ... -
登陆163邮箱 验证邮箱帐号密码是否正确
2013-06-16 22:02 3657有些时候我们只需要验证邮箱的帐号密码是否正确。而不需要发邮件 ... -
java去除字符串中的空格、回车、换行符、制表符 \r \n
2013-05-31 11:12 1515public static String replaceB ... -
第17章 线程和锁
2013-04-28 00:13 945工作之余翻译oracle官 ... -
随机数生成算法
2013-04-12 23:09 2939chrome 有很多场景我们需要产生随机数。一般是采用线性同 ... -
ThreadPoolExecutor对线程的管理
2013-03-26 13:37 788rfffff -
JMXtools的扩展
2013-01-11 10:20 2856大家都知道jmx的功能,一般都是使用三方包jmxtools.j ... -
JAVAC编译JAVA源文件
2013-01-10 09:34 1184大家都知道用javac命令可以编译java源文件,具体大家可以 ... -
Implicit super constructor SimpleJavaFileObject() is undefined for default const
2013-01-09 21:26 2193今天在引入rt.jar下包的一个类javax.tools.Si ... -
将Object转换成动态指定的对象,将一个实例引用指向一个Object引用
2013-01-08 22:48 1212将Object转换成动态指定的对象,换句话说将一个实例引用指向 ...
相关推荐
本项目“基于Go的Java Class文件解析工具”旨在利用Go语言开发一个工具,用于解析和理解这些二进制文件,帮助开发者更好地分析和理解Java程序的底层结构。 Go语言是一种静态类型的、编译型的、垃圾回收的语言,具有...
Java解析Class文件是Java开发中的一个重要环节,它涉及到对字节码的理解和处理。Class文件是Java编译器将源代码编译后的结果,包含了类的结构信息、方法定义、常量池等关键数据。理解并能解析Class文件,对于进行JVM...
Java Class文件是Java程序经过编译后的二进制表示形式,它是Java虚拟机(JVM)执行的基础。本文将深入探讨Java类文件的结构、编译过程以及如何使用提供的工具进行查看。 一、Java类文件结构 Java源代码(.java文件...
class文件变java源代码,可同时打开多个文件,关键字高亮显示
在本主题中,我们将探讨如何使用Python来解析Java的Class文件,并对其进行简单的执行。这是一项有趣的技术,可以帮助我们理解Java字节码的工作原理,同时也可以在Python环境中运行Java代码。 首先,Java的Class文件...
Java Class文件是Java程序编译后的二进制格式,它包含了类和接口的定义、方法体、常量池等信息,但这些信息是以机器可读的字节码形式存在,对于人类来说不易理解。为了查看和理解Class文件内部的源代码,我们就需要...
class文件解析器class文件解析器class文件解析器
"java class文件查看工具"就是用于这样目的的专业软件,它提供了查看和解析Class文件内容的功能。 1. **Class文件结构** Java Class文件遵循特定的文件格式,这个格式由一系列的8位字节构成,包括魔数(Magic ...
### Java对MHT文件解析及内容抓取技术详解 #### 一、引言 MHT(Mime HTML)文件是一种将HTML文档与嵌入资源(如图像、样式表等)合并为一个文件的格式,方便在网络上传输。本文将详细介绍如何使用Java语言解析MHT...
Java Class文件查看器是一款专为Java开发者设计的实用工具,它允许用户查看和分析.class文件,这是Java编译器将源代码编译后的二进制形式。了解如何使用这类工具对于理解和调试Java应用程序至关重要,尤其是在处理已...
一个简单的分析工具,用于分析”.class/.cap/.exp”格式的Java文件。 对于CAP文件,支持version 2.1 and 2.2. 适用于JCVM的学习。 使用工具时,需保证“C:\Program Files\WinZip\WINZIP32.EXE”存在,用于解压CAP...
本文将深入探讨如何在Java中解析YAML文件,包括依赖管理、封装解析类以及源码分析。 首先,为了在Java项目中使用YAML解析功能,我们需要引入相关的库。在Maven项目中,可以在`pom.xml`文件中添加SnakeYAML的依赖: ...
通过以上分析,我们可以看到,class文件解析是理解Java运行机制的关键一环,而《深入理解Java虚拟机》一书为我们提供了宝贵的理论基础和实践指导。结合样例数据,读者可以进一步探索和掌握Java虚拟机的内部运作。
Java class文件和jar文件是Java程序的二进制表示形式,它们包含了编译后的字节码,用于JVM(Java虚拟机)执行。在开发和调试过程中,有时我们需要查看源代码,但原始的.java源文件可能丢失或者不可用。这时,反编译...
### JavaClass文件的结构分析及其校验 #### 引言 随着Java技术的不断发展与广泛应用,JavaClass文件作为Java程序的基础组成部分,其结构与验证机制的重要性日益凸显。本文旨在深入探讨JavaClass文件的结构特点,并...
总结来说,理解并解析Java的class文件对于Android开发者来说非常重要,这不仅能帮助我们优化代码、排查问题,还能增强对代码底层运行机制的理解,从而编写出更高效、更安全的应用。通过学习和使用相关工具,开发者...
Java解析JSON文件是Java开发中常见的一项任务,特别是在与Web服务交互或处理API响应时。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,因其简洁和易于阅读及编写的特点,被广泛应用于网络数据传输...
`JavaDecompiler`这个标题暗示我们将探讨如何使用Java反编译器来打开和解析.class文件。 Java类文件是Java虚拟机(JVM)执行的二进制格式,包含了程序的指令、常量池、字段和方法定义等信息。然而,这些信息对于...
Java 解析 DBF 文件方案 Java 解析 DBF 文件方案是使用 Java 语言来读取和解析 DBF 文件的方法。DBF 文件是一种常见的数据库文件格式,广泛应用于许多行业。为了读取和解析 DBF 文件,需要使用 Java 语言中的数据库...