数据类型:
class 文件结构
minor version:副版本
major version:主版本号
文件的版本号 major_version.minor_version
flags:访问标志
- ACC_PUBLICH 声明为publich
- ACC_FINAL 声明为final
- ACC_SUPER 当用到invokespecial指令时,需要对父类方法做特殊处理
- ACC_INTERFACE 该class文件定义的是接口而不是类
- ACC_ABSTRACT 声明为abstract
- ACC_SYNTHETIC 声明为synthetic
- ACC_ANNOTATION 标识注解类型
- ACC_ENUM 标识枚举类型
constant pool 常量池
方法调用和返回指令
- invokevirtual 指令用于调用对象的实例方法,根据对象的实际类型进行分派
- invokeinterface 指令用于调用接口方法,它会在运行时搜索由特定对象实现的这个接口方法,并找出适合的方法进行调用
- invokespecial 指令用于调用一些需要特殊的实例方法,包括实例的初始化,私有方法和父类方法
- invokestatic 指令用于调用命名类中的静态方法
- invokedynamic 指令用于调用可以绑定invokedynamic指令的调用点对象作为目标方法。
aaload_<n>:从局部变量表中加载索引值为n的引用
aconst_null:将一个null值压入到操作数栈顶
putfield:为制定类的字段赋值
通过执行javac xxx.java javap -verbose xxx.class 查看class文件
public class AconstNullDemo { Integer i=null; void test(){ i=1; if(i.equals(Integer.valueOf(1))){ System.out.println("eq"); } } } public class common.jvm.AconstNullDemo minor version: 0 major version: 52 flags: ACC_PUBLIC, ACC_SUPER Constant pool: #1 = Methodref #9.#20 // java/lang/Object."<init>":()V #2 = Fieldref #8.#21 // common/jvm/AconstNullDemo.i:Ljava/lang/Integer; #3 = Methodref #22.#23 // java/lang/Integer.valueOf:(I)Ljava/lang/Integer; #4 = Methodref #22.#24 // java/lang/Integer.equals:(Ljava/lang/Object;)Z #5 = Fieldref #25.#26 // java/lang/System.out:Ljava/io/PrintStream; #6 = String #27 // eq #7 = Methodref #28.#29 // java/io/PrintStream.println:(Ljava/lang/String;)V #8 = Class #30 // common/jvm/AconstNullDemo #9 = Class #31 // java/lang/Object #10 = Utf8 i #11 = Utf8 Ljava/lang/Integer; #12 = Utf8 <init> #13 = Utf8 ()V #14 = Utf8 Code #15 = Utf8 LineNumberTable #16 = Utf8 test #17 = Utf8 StackMapTable #18 = Utf8 SourceFile #19 = Utf8 AconstNullDemo.java #20 = NameAndType #12:#13 // "<init>":()V #21 = NameAndType #10:#11 // i:Ljava/lang/Integer; #22 = Class #32 // java/lang/Integer #23 = NameAndType #33:#34 // valueOf:(I)Ljava/lang/Integer; #24 = NameAndType #35:#36 // equals:(Ljava/lang/Object;)Z #25 = Class #37 // java/lang/System #26 = NameAndType #38:#39 // out:Ljava/io/PrintStream; #27 = Utf8 eq #28 = Class #40 // java/io/PrintStream #29 = NameAndType #41:#42 // println:(Ljava/lang/String;)V #30 = Utf8 common/jvm/AconstNullDemo #31 = Utf8 java/lang/Object #32 = Utf8 java/lang/Integer #33 = Utf8 valueOf #34 = Utf8 (I)Ljava/lang/Integer; #35 = Utf8 equals #36 = Utf8 (Ljava/lang/Object;)Z #37 = Utf8 java/lang/System #38 = Utf8 out #39 = Utf8 Ljava/io/PrintStream; #40 = Utf8 java/io/PrintStream #41 = Utf8 println #42 = Utf8 (Ljava/lang/String;)V { java.lang.Integer i; descriptor: Ljava/lang/Integer; flags: public common.jvm.AconstNullDemo(); descriptor: ()V flags: ACC_PUBLIC Code: stack=2, locals=1, args_size=1 0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V 4: aload_0 //将null压入栈顶 5: aconst_null //将null赋值给属性i 6: putfield #2 // Field i:Ljava/lang/Integer; 9: return LineNumberTable: line 6: 0 line 7: 4 void test(); descriptor: ()V flags: Code: stack=2, locals=1, args_size=1 //加载this到操作栈 0: aload_0 //加载常量1到操作栈 1: iconst_1 //调用静态方法 2: invokestatic #3 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer; //将计算结果赋值给属性,为什么putfield的索引不是连续的?这是因为invokestatic操作和操作数长度为3个slot 5: putfield #2 // Field i:Ljava/lang/Integer; //加载this到操作栈 8: aload_0 //将属性压入栈顶 9: getfield #2 // Field i:Ljava/lang/Integer; //加载常量1到操作栈顶 12: iconst_1 //调用静态方法Integer.valueOf() 13: invokestatic #3 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer; //调用虚方法equals 16: invokevirtual #4 // Method java/lang/Integer.equals:(Ljava/lang/Object;)Z //如果ifeq的结果为0则挑战到30行 19: ifeq 30 22: getstatic #5 // Field java/lang/System.out:Ljava/io/PrintStream; 25: ldc #6 // String eq 27: invokevirtual #7 // Method java/io/PrintStream.println:(Ljava/lang/String;)V 30: return LineNumberTable: line 10: 0 line 11: 8 line 12: 22 line 14: 30 StackMapTable: number_of_entries = 1 frame_type = 30 /* same */ }
相关推荐
有时候,为了学习源码,我们希望将.java已经编译成.class的文件反编译为.java文件,如何还原为.java文件呢? 此款软件可以帮您将.class文件反编译为.java文件。 —好不好? ——谁用谁知道!
ClassFinal是一款java class文件安全加密工具,支持直接加密jar包或war包,无需修改任何项目代码,兼容spring-framework;可避免源码泄漏或字节码被反编译。.zip 软件开发设计:应用软件开发、系统软件开发、移动...
java反编译工具,class文件 反编译成代码,学习java必备
* 主要用于存储以下内容: * 1、字面量,包括文本字符串、被申明为final类型的常量等 * 2、符号引用:类或是接口的全限定名称、方法以及字段的名称及描述符
java 的反编译器,可以方便的查看.class的源码,有助于java的学习。
这个文档通过阅读、分析和翻译二进制格式的Java Class文件学习Java Class的技术。
一个简单的分析工具,用于分析”.class/.cap/.exp”格式的Java文件。 对于CAP文件,支持version 2.1 and 2.2. 适用于JCVM的学习。 使用工具时,需保证“C:\Program Files\WinZip\WINZIP32.EXE”存在,用于解压CAP...
支持java文件的反编译,轻松拿到开发代码,是学习利器和办公良品!
主要介绍了IntelliJ IDEA右键文件夹没有Java Class文件的原因及解决方法,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
Java编译语言将Java代码编译成.class文件(只有一种形式),而C/C++语言将代码编译成01码,不同的操作系统的01码指令不同,这造成了不能跨平台,而Java将这个任务交给JVM,不同操作系统上的JVM将.class文件编译成不同...
Android逆向-java,dex文件分析软件,是为了学习class文件的时候进行辅助的一个脚本,希望可以帮助到一些学习java的人。
了解Class文件的结构组成,对于我们后续的JVM以及Java原理深入学习是很有帮助的,因为Class文件帮我们默默的做了很多事,比如、为什么对象方法中可以直接使用this变量?!本文将带领大家,一步步,从开头到结尾,...
java 基础 在网上找到的一个java学习者的方法,看了也许会有用的吧
JAVA命令->要使用一个*.class文件(类文件)->通过classpath找到*.class文件所保存的真实目录,之后再进行加载执行 小结 Path的主要功能是设置JDK的可执行命令 classpath主要是在执行时候起作用,告诉JVM类的保存路径...
反编译class文件,很实用的小工具,在eclipse中直接反编译class文件,有助于源码学习
可以反编译CLASS查看JAVA源码! 是一个很好学习JAVA的工具! 大家下载吧!
public class FileFormatChange { /** * 1、创建输入(输出)流对象 * 2、读(写)数据 * 3、关闭输入输出流 */ public static void main(String[] args) { // TODO Auto-generated method stub ...
主要介绍了Java如何修改.class文件变量,帮助大家更好的理解和学习Java,感兴趣的朋友可以了解下
Java编写的网页版魔方游戏,编译后生成.class文件,然后用HTML去调用,不过运行时候需要你的浏览器安装有运行Class的插件。Java源代码实现部分,比较有意思,也具参考性。像坐标控制、旋转矩阵、定时器、生成图像...
4. 在一个*.Java的文件中,只能有一个public class 的声明,但是允许有多个class的声明。 5. 数据的溢出:任何一种数据都有其最大的取值:如果已经是最大的值,则加1会变成最小值,如果是最小减1会变成最大值。