- 浏览: 597330 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (213)
- jdk (40)
- J2EE (8)
- JavaScript (16)
- spring (1)
- 正则 (10)
- ORACLE (18)
- CSS (1)
- 生活学习 (14)
- XML (3)
- Linux (11)
- 项目架设 (12)
- Junit (1)
- Derby (3)
- JMX (5)
- 版本控制 (4)
- PowerDesigner (1)
- 加密解密 (1)
- android (4)
- Eclipse (4)
- Hibernate (6)
- Tomcat (4)
- JasperReport&iReport (1)
- SqlServer (6)
- C++ (3)
- 系统架构涉及名词解释 (5)
- Hadoop (8)
- windows (2)
- SOA (1)
- 有趣的Google (1)
- 编程语言 (0)
- 数据结构与算法 (1)
- nodejs (1)
- 一些测试整理备份在这里吧 (0)
- 性能 (3)
- Drill (5)
- 学习 (1)
最新评论
看了第6章的java class文件这一部分,我觉得对class文件有进一步的了解。于是想作一点笔记,以备以后查时方便。
这章的一个例子虽然简单,但是我觉的很有一定代表性。例子如下:
我用javap -verbose Act查看,代码如下:(红色为自己加上的注解)
Compiled from "Act.java"
因为编译原文件不一定必须与java语言相关,可以使用其他语言来编写程序,然后将其编译为class文件,所以这里要写上Act.java而不是Act. 呵呵,想来以前为什么javac 来编译源文件时一定要加.java,而java 执行时就不需要加.java了,当时就是搞不懂,现在明白了。
class Act extends java.lang.Object
SourceFile: "Act.java"
SourceFile属性,它提供了产生class文件的源文件的名称,它是一个可选的项,为什么说它是可选项的,因为class可以自己用UE等工具写。
minor version: 0
major version: 49
版本号:我用的是5.0的,出来的major version 是49,书上说1.0或1.2是45,1.4我想可能是48 吧。呵呵,还没有试过。
Constant pool:
这个是常量池,刚看书的时候我还以为常量池放的一定是常量。错。
常量池就是该类型所用常量的一个有序集合,包括直接常量(String,integer,floating point常量)和对其他类型、字段和方法的符号引用。
const #1 = Method #3.#12; // java/lang/Object."<init>":()V
因为Constant pool#0是不用的,所以只能从#1开始,但不知为什么第一个是Method而不是class,我现在还不明白。
const #2 = class #13; // Act
CONSTANT_Class是对一个类或接口的符号引用。这个是指向#13
const #3 = class #14; // java/lang/Object
const #4 = Asciz <init>;
这个Asciz应该表示是CONSTANT_Utf8吧,因为C ONSTANT_Utf8可以是存储四种基本信息类型:文字字符串、被定义的类和接口描述、对其他类或接口的符号引用以及属性相关的字符串。
<init>是实例的初始化方法,是实例调用方法前必须要<init>的,
<clinit>是类的初始化方法。
const #5 = Asciz ()V;
此<init>的描述符,()V表示<init>没有带参数,返回的是void型的。
书上介绍:
()I int getSize()
() Ljava/lang/String String toString()
const #6 = Asciz Code;
Code在所有不是抽象或者本地方法的method_info信息中,都存在一个Code_attribute表。
但是我试一下在抽象的方法中同样也有code的啊,不懂中。
const #7 = Asciz LineNumberTable;
LineNumberTable属性建立了方法字节码流偏移量和源代码行号之间的映射关系。关于这一点,我在下面详细谈到。
const #8 = Asciz doMathForever;
#8 字段名和方法名以简单名称出现在常量池的入口中,存的时候存简单名字,调用的时候要加 上全限定名
const #9 = Asciz (I)V;
doMathForover的描述符,参数是int类型,返回值是void类型
const #10 = Asciz SourceFile;
const #11 = Asciz Act.java;
const #12 = NameAndType #4:#5;// "<init>":()V
NameAndType指向字段或者方法的符号引用的一部分。为什么没有指向#8,#9呢?不懂中。
const #13 = Asciz Act;
const #14 = Asciz java/lang/Object;
#13,#14 CONSTANT_Utf8_info 表的入口,容纳了 类/接口全限定名等信息。用“/”代替“.”。在class文件的this_class字段是对常量池的一个引用,指向了常量池中CONSTANT_ClASS_info表,该表由两项组成,即标签和name_index。在这个例子里,this_class的值为2,也就是常量池里的第二项,这项标签是class,name_index是13,即指向常量池的第13项。第13项里就有当前类的全限定名。
{
Act();
Code:
Stack=1, Locals=1, Args_size=1
需要的栈为1个,只是this的存取;本地变量为1个,也是this,方法的参数是1个,也是this传入。
0: aload_0
从局部变量0中装载引用类型。
1: invokespecial #1; //Method java/lang/Object."<init>":()V
调用Object的<init>方法,因为每个类都是继承Object,所以实例时都要调用Object的<init>方法。
4: return
LineNumberTable:
line 1: 0
public static void doMathForever(int);
Code:
Stack=2, Locals=3, Args_size=1
0: iconst_0 将i 压入栈
1: istore_1 放i
2: iconst_1 同上
3: istore_2
4: iinc 1, 1 i++
7 iload_1 从局部变量1中装载int类型值。
8: iconst_2
9: imul
10: istore_1
11: goto 4
LineNumberTable:
line 3: 0 源代码第3行对应Code中的0偏移量。
line 4: 2
line 6: 4
line 7: 7
line 8: 11
}
http://www.blogjava.net/baogenfly/articles/78557.html
这章的一个例子虽然简单,但是我觉的很有一定代表性。例子如下:
class Act { public static void doMathForever(int m) { int i = 0; int n=4>3?1:0; for (;;) { i += 1; i *= 2; } } }
我用javap -verbose Act查看,代码如下:(红色为自己加上的注解)
Compiled from "Act.java"
因为编译原文件不一定必须与java语言相关,可以使用其他语言来编写程序,然后将其编译为class文件,所以这里要写上Act.java而不是Act. 呵呵,想来以前为什么javac 来编译源文件时一定要加.java,而java 执行时就不需要加.java了,当时就是搞不懂,现在明白了。
class Act extends java.lang.Object
SourceFile: "Act.java"
SourceFile属性,它提供了产生class文件的源文件的名称,它是一个可选的项,为什么说它是可选项的,因为class可以自己用UE等工具写。
minor version: 0
major version: 49
版本号:我用的是5.0的,出来的major version 是49,书上说1.0或1.2是45,1.4我想可能是48 吧。呵呵,还没有试过。
Constant pool:
这个是常量池,刚看书的时候我还以为常量池放的一定是常量。错。
常量池就是该类型所用常量的一个有序集合,包括直接常量(String,integer,floating point常量)和对其他类型、字段和方法的符号引用。
const #1 = Method #3.#12; // java/lang/Object."<init>":()V
因为Constant pool#0是不用的,所以只能从#1开始,但不知为什么第一个是Method而不是class,我现在还不明白。
const #2 = class #13; // Act
CONSTANT_Class是对一个类或接口的符号引用。这个是指向#13
const #3 = class #14; // java/lang/Object
const #4 = Asciz <init>;
这个Asciz应该表示是CONSTANT_Utf8吧,因为C ONSTANT_Utf8可以是存储四种基本信息类型:文字字符串、被定义的类和接口描述、对其他类或接口的符号引用以及属性相关的字符串。
<init>是实例的初始化方法,是实例调用方法前必须要<init>的,
<clinit>是类的初始化方法。
const #5 = Asciz ()V;
此<init>的描述符,()V表示<init>没有带参数,返回的是void型的。
书上介绍:
()I int getSize()
() Ljava/lang/String String toString()
const #6 = Asciz Code;
Code在所有不是抽象或者本地方法的method_info信息中,都存在一个Code_attribute表。
但是我试一下在抽象的方法中同样也有code的啊,不懂中。
const #7 = Asciz LineNumberTable;
LineNumberTable属性建立了方法字节码流偏移量和源代码行号之间的映射关系。关于这一点,我在下面详细谈到。
const #8 = Asciz doMathForever;
#8 字段名和方法名以简单名称出现在常量池的入口中,存的时候存简单名字,调用的时候要加 上全限定名
const #9 = Asciz (I)V;
doMathForover的描述符,参数是int类型,返回值是void类型
const #10 = Asciz SourceFile;
const #11 = Asciz Act.java;
const #12 = NameAndType #4:#5;// "<init>":()V
NameAndType指向字段或者方法的符号引用的一部分。为什么没有指向#8,#9呢?不懂中。
const #13 = Asciz Act;
const #14 = Asciz java/lang/Object;
#13,#14 CONSTANT_Utf8_info 表的入口,容纳了 类/接口全限定名等信息。用“/”代替“.”。在class文件的this_class字段是对常量池的一个引用,指向了常量池中CONSTANT_ClASS_info表,该表由两项组成,即标签和name_index。在这个例子里,this_class的值为2,也就是常量池里的第二项,这项标签是class,name_index是13,即指向常量池的第13项。第13项里就有当前类的全限定名。
{
Act();
Code:
Stack=1, Locals=1, Args_size=1
需要的栈为1个,只是this的存取;本地变量为1个,也是this,方法的参数是1个,也是this传入。
0: aload_0
从局部变量0中装载引用类型。
1: invokespecial #1; //Method java/lang/Object."<init>":()V
调用Object的<init>方法,因为每个类都是继承Object,所以实例时都要调用Object的<init>方法。
4: return
LineNumberTable:
line 1: 0
public static void doMathForever(int);
Code:
Stack=2, Locals=3, Args_size=1
0: iconst_0 将i 压入栈
1: istore_1 放i
2: iconst_1 同上
3: istore_2
4: iinc 1, 1 i++
7 iload_1 从局部变量1中装载int类型值。
8: iconst_2
9: imul
10: istore_1
11: goto 4
LineNumberTable:
line 3: 0 源代码第3行对应Code中的0偏移量。
line 4: 2
line 6: 4
line 7: 7
line 8: 11
}
http://www.blogjava.net/baogenfly/articles/78557.html
发表评论
-
关于饿汉式单例首次初始化失败后,可以再次尝试?
2012-07-11 15:14 1272思考一个问题,以下代码是一个简单的饿汉式单例代码,显然在第一次 ... -
由ApacheCommon-BeanUtils1.8.3发现的Java HotSpot(TM)的Bug
2012-07-03 15:42 1614由ApacheCommon-BeanUtils1.8.3发现的 ... -
JVM垃圾回收
2012-04-19 13:02 3533一、JVM内存模型及垃圾收集算法 1.根据Java虚 ... -
Java构建HashCode相同字符串算法
2012-01-10 15:05 5584import java.math.BigDecimal; ... -
线程全部结束与集合点
2011-11-12 16:26 1258final int size = 50; fin ... -
ddddddddd
2011-11-12 16:21 1265dddddddddd -
ccccccc
2011-11-12 16:20 2040ccccccccccc -
bbbbbb
2011-11-12 16:19 1822bbbbb -
Aaaaa
2011-11-12 16:19 944aaaaaaaa -
备忘链接
2011-08-16 18:25 962翻译,随便写了写,备忘一下 URLConnection co ... -
jvisualvm监听JVM
2011-08-05 10:14 1213配置好 set JAVA_OPTS=%JAVA_OPTS ... -
JVM 调优 技巧
2011-08-02 15:59 12701.升级 JVM 版本。如果能使用64-bit,使用64-bi ... -
JVM垃圾回收策略
2011-08-02 14:59 1068为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不 ... -
Java GC
2011-08-02 13:38 1062调整JVM GC(Garbage Collection),可 ... -
Java的弱引用(Weak Reference)
2011-05-18 16:07 1258要理解弱引用,首先要 ... -
使用classloader动态加载Class
2011-05-17 14:25 975http://www.javaworld.com/javawo ... -
.class文件格式--java字节码文件的格式
2011-05-14 23:07 25491 . 目的 Java 虚拟机识别的 class 文件格式包含 ... -
Calendar
2011-03-30 14:13 1069/**获得参数月份的一号及其下一个月的一号*/ priva ... -
Bad version number in .class file
2011-03-04 15:08 1347java.lang.UnsupportedClassVersi ... -
Java反射之:判断修饰符
2010-12-24 11:36 2604import java.lang.reflect.Modifi ...
相关推荐
class文件查看器,可以查看class文件,转译出代码.方便大家使用.(java工具类)简单的工具没这么多说明,说这些只是为了凑字数啦啦啦啦
- **常量池查看**:查看和解析Class文件中的字符串、类名、方法名等常量信息。 - **类和方法信息**:展示类的访问权限、继承关系、实现的接口,以及方法的参数、返回类型等详细信息。 - **属性信息**:如方法的...
在Java开发过程中,有时我们需要查看已编译的`.class`文件来理解代码的执行逻辑,尤其是在遇到异常或问题时,查看字节码有助于排查问题。Eclipse作为一个强大的Java集成开发环境,本身并不直接支持查看`.class`文件...
在IT行业中,开发人员经常需要对编译后的Java类文件(class文件)进行反编译和查看,以理解代码的内部工作原理或者调试问题。Eclipse作为一款强大的Java集成开发环境,提供了这样的功能,但默认情况下并不直接支持...
这款工具对于Java开发人员来说尤其有用,因为它能够帮助他们快速地查看和理解已编译的`.class`文件中的源代码,这对于调试、学习和优化代码非常有帮助。 **一、Java字节码基础知识** 在深入探讨JDGUI之前,我们...
《JD-GUI:便捷的Class文件查看神器》 在Java编程世界中,了解和调试类文件(.class)是开发者日常工作中不可或缺的一部分。JD-GUI,这个小巧却强大的工具,正是为了解决这一需求而生。它是一款纯绿色的软件,无需...
标题中的“查看Class文件的一个小工具”指的是一个专门用于查看Java字节码文件(.class文件)的应用程序。这类工具通常被Java开发者用来理解和调试已编译的Java类。.class文件是Java源代码经过Java编译器编译后的...
Eclipse作为一款强大的Java集成开发环境,提供了多种方式来帮助开发者查看.jar文件中的.class文件源码。本文将详细介绍如何在Eclipse中使用插件实现这一功能,以及一种名为JD的jar包反编译查看工具。 首先,我们来...
例如,当我们遇到异常或者错误,但日志信息不足以定位问题时,可以通过查看对应class文件的字节码来查找原因。在进行代码优化时,它可以展示方法的执行流程,帮助我们找出瓶颈。对于学习Java虚拟机原理和Java字节码...
在Java编程领域,我们常常会遇到需要查看或分析已编译的.class文件的情况。这些文件是Java源代码经过编译器处理后的产物,包含了程序的字节码和元数据。对于开发者来说,了解.class文件的内部结构有助于调试、优化和...
Java Class文件查看器是一款专为Java开发者设计的实用工具,它允许用户查看和分析.class文件,这是Java编译器将源代码编译后的二进制形式。了解如何使用这类工具对于理解和调试Java应用程序至关重要,尤其是在处理已...
查看java的class文件,在网络上搜索了一下资料,这样就很方便的去查看别人的代码 在myeclipse中查看class文件,就像查看普通的java源文件一样,通过以下步骤可以做到: 安装设置步骤:1. 下载jadnt158.zip 。 2. ...
"查看class文件工具"就是为了解决这一需求而存在的。 `jd-gui`是一款开源的Java反编译工具,它允许开发者直观地查看并分析`.class`文件的内容。这个工具由JetBrains公司开发,以其高效和易用性著称。通过`jd-gui`,...
这个压缩包`class文件编译器.zip`很可能包含了关于如何将Java源代码编译成`.class`文件的相关工具和信息。`ReadMe.txt`可能是提供编译过程的说明或者编译器使用的指南。 1. **Java源代码与Class文件**: Java源...
2. **找到并修改class文件**:在解压后的目录中找到需要修改的class文件,使用反编译工具(如jd-gui或jd-core-java)查看其源代码,理解并进行必要的修改。修改完成后,需要使用Java编译器(javac)重新编译修改过的...
2、可处理多个*.class文件,可以处理文件夹内的所有文件,甚至可以处理*.jar文件; 3、带有多页面文本编辑器,也可集成在资源管理器中,随时点击右键都可进行操作; 4、支持java语法的高亮显示; 使用说明: ======...
本篇文章将详细讲解如何使用指定的"电脑java class文件查看与修改工具"来查看和修改这些文件。 首先,我们要了解的是`jd-gui查看.exe`。这是一个名为JD-GUI的开源工具,它允许开发者直观地查看Java字节码(.class...
在Java开发过程中,Eclipse作为一款强大的集成开发环境(IDE),不仅支持源代码编写,还提供了查看和理解已编译的Class文件的功能。这对于开发者调试、学习和理解已部署的二进制代码非常有帮助。以下将详细介绍如何在...
轻松方便的把class文件转化为java文件