数据类型:
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程序编译后的二进制格式,它包含了类和接口的定义、方法体、常量池等信息,但这些信息是以机器可读的字节码形式存在,对于人类来说不易理解。为了查看和理解Class文件内部的源代码,我们就需要...
Java Class文件是Java源代码经过编译器处理后的二进制形式,它们包含了程序的结构信息,如类、接口、变量、方法等定义。在Java开发过程中,有时我们需要查看或分析这些Class文件,以理解程序运行原理、调试或逆向...
Java Class文件查看器是一款专为Java开发者设计的实用工具,它允许用户查看和分析.class文件,这是Java编译器将源代码编译后的二进制形式。了解如何使用这类工具对于理解和调试Java应用程序至关重要,尤其是在处理已...
### Java反编译工具:将.class文件转换为.java文件 #### 概述 在软件开发领域,有时我们可能需要分析第三方库或者开源项目的内部结构,这时就需要借助于反编译工具来帮助我们阅读和理解其源码。Java作为一种广泛...
本篇文章将详细讲解如何使用指定的"电脑java class文件查看与修改工具"来查看和修改这些文件。 首先,我们要了解的是`jd-gui查看.exe`。这是一个名为JD-GUI的开源工具,它允许开发者直观地查看Java字节码(.class...
Java class文件和jar文件是Java程序的二进制表示形式,它们包含了编译后的字节码,用于JVM(Java虚拟机)执行。在开发和调试过程中,有时我们需要查看源代码,但原始的.java源文件可能丢失或者不可用。这时,反编译...
Java反编译是将已编译的字节码(.class文件)转换回源代码(.java文件)的过程,这对于理解和学习已有的Java程序、逆向工程或调试都是很有用的。标题提到的"java反编译工具"是用于这个目的的软件,它能够帮助开发者...
它允许用户查看并理解已编译的.class文件的内容,因为Java的源代码(.java文件)通常不会随可执行文件一起发布。`JavaDecompiler`这个标题暗示我们将探讨如何使用Java反编译器来打开和解析.class文件。 Java类文件是...
Java class文件是Java程序编译后的二进制代码,它包含了类、方法、变量等信息。但是,由于class文件是以机器可读的形式存在,对于人类来说并不直观。这时,我们就需要借助于反编译工具来将class文件转换回源代码...
Java Class文件编辑器,如JD-GUI 0.3.3 绿色版,是一种用于查看和理解Java字节码的工具,对于开发者而言尤其重要,因为它提供了将已编译的`.class`文件反编译回源代码的能力。在深入讨论这个工具之前,我们先来了解...
Java Class文件反编译工具是开发者在处理已编译的.class文件时的一种实用工具,它能够将二进制的Class文件转换回可读性更强的源代码格式,这对于理解和调试已封装的库或分析未知的Java程序至关重要。本文将详细介绍...
**JAVA CLASS文件查看器** JAVA CLASS文件是Java字节码文件,它包含了Java源代码编译后的机器可读代码。这种文件格式对于开发者来说非常重要,因为它允许他们理解已编译的程序,尤其是在没有源代码的情况下。"JAVA ...
总之,jd-gui.exe作为一款便捷的Java反编译工具,使得开发者能够轻松地查看和理解.class文件中的代码,对于学习、调试和研究都有着很大的帮助。在使用过程中,我们需要注意其局限性,如代码格式和注释可能不完整,...
本资源提供的是一款名为JD-GUI的免费Java反编译工具,它可以帮助开发者将.class文件转换回易于理解的.java源代码格式。 JD-GUI是一款图形用户界面应用,设计简洁,使用方便。它允许用户直接打开.class文件,快速...
Java解析Class文件是Java开发中的一个重要环节,它涉及到对字节码的理解和处理。Class文件是Java编译器将源代码编译后的结果,包含了类的结构信息、方法定义、常量池等关键数据。理解并能解析Class文件,对于进行JVM...
Java 修改 Class 文件工具有很多,其中“JBE”(全称可能为 Java Bytecode Editor 或类似)是一个专门用于查看和编辑 Java 字节码的工具。它允许开发者在编译后的级别上操作 Java 类,这对于调试、逆向工程、优化...
标题“java编译class文件”涉及的核心知识点是Java的编译过程。Java源代码文件的扩展名为`.java`,这些文件包含类定义、方法定义以及其他Java语法元素。要将`.java`文件编译成`.class`文件,我们需要使用Java的JDK...
"java class 文件查看神器"通常指的是用于查看和分析这些二进制类文件的工具,帮助开发者理解程序的内部结构和工作原理。在这种情况下,提到的“神器”很可能是`jd-gui`。 `jd-gui`是一款非常实用的Java反编译器,...
Java Class反编译工具是程序员在处理已编译的字节码文件时不可或缺的辅助工具。这类工具的主要功能是将`.class`文件转换回可读性强的`.java`源代码,帮助开发者理解或修改已有的Java程序,尤其在没有源代码的情况下...
Xjad是一款专门用于将Java class文件转换回源代码(.java文件)的工具,它使得开发者能够查看并理解已编译的Java代码,这对于学习、调试、分析或逆向工程非常有用。 反编译是一个复杂的过程,因为它试图从已经失去...