其实就是我们前端的编译过程,是通过javac(编译器)把java文件变成.class字节码文件。...上述这段代码生成的抽象语法树如下( IDEA JDT AstView 插件可以查看抽象语法树): 上述抽象语法树在Java中使用com.sun.tools.javac.tree.JCTree类来表示...5 Class File 解析 这个里面东西属实太多而且繁杂,大家有兴趣了可以看看我的JVM专栏里的纸质笔记 链接: JVM学习专栏 链接: JVM学习笔记-Class类文件结构介绍——(纸质笔记)...链接: JVM学习笔记-Class类文件结构-魔数,版本号,常量池——(纸质笔记) 链接: JVM学习笔记-Class类文件结构-访问标志,类索引,父类索引,接口索引集合——(纸质笔记) 链接: JVM...学习笔记-Class类文件结构-字段表,方法表集合——(纸质笔记) 链接: JVM学习笔记-Class类文件结构-属性表集合——(纸质笔记)
一、前言 我们在日常学习中,对一个java代码有问题,不知道jvm内部怎么进行解析的时候;有个伟大壮举就是反编译,这样就可以看到jvm内部怎么进行对这个java文件解析的!...我们可以使用JDK自带的javap命令来进行反编译,反编译出来的如果看不太明白,可以使用Jad工具来配合使用。...二、编写java文件 public class JavaPTest { String string = new String("学") + new String("Java"); } 三、科补代码理解...五、执行javap命令 在IDEA的java类中按快捷键ctrl + f9编译成class文件,为反编译做准备; 找到class文件的位置 来到此目录下,不用cd切换到这个目录了哈 输入...七、总结 这样我们就完成了class文件反编译了,两种方法有利有弊,大家根据实际情况来进行反编译。
——莎士比亚 反编译class为java文件,我们可以用到jad 下载 使用方式: 首先解压jar包 在jad所在目录下执行 jad.exe -r -ff -d D:\mc\source\FortuneTelling...-s java D:\mc\source\original-FortuneTelling-1.0-SNAPSHOT\**\*.class ps: jad.exe -r -ff -d [反编译后代码存放路径...] -s java [需要反编译包含class的目录]\**\*.class 帮助 This is README file for Jad - the fast Java Decompiler....Jad uses JAVA class name as an output file name....For example, if class file 'example1.class' contains JAVA class 'test1' then Jad will create file 'test1
了解下这两个文件类型:.java文件是给人看的,.class是给计算机看的。程序员编写的是.java文件,经编译后生成.class文件给计算执行。 相信这两句话很形象的说明了这两个文件的关系了。...1,首先反编译器就是jd-gui这个软件了,可以把jar包直接拖进这个软件就能够看到代码了。当然jd-gui不能编译.class文件。 2,怎么把.class转成.java文件呢?...新建的一个.java文件有.class的前提是要编译成功,比我常用的项目是maven工程,要先maven install编译才能生成“完整的”.class文件,单单保存是不行的,这里下面会有说明。...eclipse可以通过ctrl+shift+R,然后输入类名,可同时看到.class和.java文件。 4,怎么编译单个的java文件呢?...也就是在eclipse中虽然保存后有.class文件,但是不一定编译成功。
java-decompiler 反编译工具 Java Decompiler 是Java反编译工具,可以对 Java 5 和更高版本的 class 文件进行反编译分析。...主旨内容 Java Decompiler是一项开源工具,Java Decompiler工具不仅可以实现反编译.class文件,将.class文件变为可以被我们阅读的.java文件,而且还可以对jar包进行反编译...,得到jar包中.class文件反编译的.java文件。...打开官方文章,我们会发现这个工具已经已经很久没有更新了,到现在,2024年安装一个旧版本工具,不出意外会遇到很多兼容性问题,所以在本篇文章中,主要说明下在2024年使用这个工具可能存在的一些问题。...jar文件是java的可执行文件,右键点击或双击下载后的jd-gui-1.4.0.jar文件即可运行该反编译工具,运行时可以看到咖啡的图标,传统Java=咖啡。
出现这种错误一般是工程是别的机器上的,靠过来放到自己机器上就不行了 1 找到工程下的 .classpath这个文件 , 查看 con 节点; 2 找到自己编译过的本地工程 然后把 con节点复制过来
将.class文件转换为.java文件的方法有两种: 方法一:使用Java反编译工具 下载并安装Java反编译工具,比如JD-GUI、Fernflower等。...打开反编译工具,选择要转换的.class文件。 点击反编译按钮,工具会将.class文件转换为对应的.java文件。...方法二:使用Java反射机制 使用Java反射机制,通过Class类的getResourceAsStream()方法获取.class文件的输入流。...使用ASM库或其他类似的字节码操作库,将输入流中的字节码转换为对应的.java文件。...("YourClass.class"); // 创建输出流,将字节码写入.java文件 FileOutputStream outputStream =
根据 Java 虚拟机规范,类文件由单个 ClassFile 结构组成: ClassFile { u4 magic; //Class 文件的标志 u2...高版本的 Java 虚拟机可以执行低版本编译器生成的 Class 文件,但是低版本的 Java 虚拟机不能执行高版本编译器生成的 Class 文件。...字面量比较接近于 Java 语言层面的的常量概念,如文本字符串、声明为 final 的常量值等。而符号引用则属于编译原理方面的概念。...上述这些信息中,各个修饰符都是布尔值,要么有某个修饰符,要么没有,很适合使用标志位来表示。而字段叫什么名字、字段被定义为什么数据类型这些都是无法固定的,只能引用常量池中常量来描述。...与 Class 文件中其它的数据项目要求的顺序、长度和内容不同,属性表集合的限制稍微宽松一些,不再要求各个属性表具有严格的顺序,并且只要不与已有的属性名重复,任何人实现的编译器都可以向属性表中写 入自己定义的属性信息
命令 javac Hello.java dx --dex -- output=Hello.dex Hello.class javap -c -classpath ....Hello 使用dexdump.exe 位于Android SDK 的 platform-tools dexdump.exe -d Hello.dex 如果使用JDK1.7编译Hello.java...生成的Hello.class默认的版本会比较低 使用dx生成dex文件会提示class文件无效 javac -source 1.6 -target 1.6 Hello.java
Java class文件是什么? java class 文件是对Java程序二进制文件格式的精确定义。每一个Java class文件都对一个Java类或者Java接口做出了全面描述。...无论Java class文件在何种系统上产生,无论虚拟机在何种操作系统上运行,对Java class文件的精确定义使得所有Java虚拟机都能够正确地读取和解释所有Java class文件。...如上图所示:可以使用其他语言来编写程序,然后将其编译为class文件,或者把Java程序编译为另一种不同的二进制文件格式。...实际上,Java class文件的形式能够表示Java源代码中无法表达的有效程序,然而,绝大多数Java开发者几乎都会选择使用class文件作为传递给虚拟机的首要方式。...在运行时,Java虚拟机使用常量池的全限定名、方法和字段的描述符,把当前类或接口中的代码与其他类或接口中的代码连接起来。
本文,我们编写JAVA程序来解析class文件,读者注意,阅读本文前先详细了解Class文件结构,可参考笔者前一篇文章:Class文件结构(1)—手动解析每一个字节,你看不懂 代码地址:https...先定义对应class文件结构中各项的类型,如常量池、字段表、方法表、属性表、U2、U4,再定义各项的解析器,并使用责任链模式完成class文件结构各项的解析工作。...使用ByteBuffer而不直接使用byte[]缓存读取的class文件内容是因为ByteBuffer能更好的控制顺序读取。...该class文件字节缓存与class文件结构各项解析器使用的是同一个缓存对象,都是从同一个class文件读取到内存中的ByteBuffer对象。...该属性不一定会编译到class文件中,如果没有该属性,那么查看反编译后的java代码将会使用诸如arg0、arg1、arg2之类的名称代替局部变量的名称。
Class文件的存在使得不同语言编写的程序都可以运行在Java虚拟机上,只需要这些语言经过编译器编译后的Class文件符合Java虚拟机定义的规范,Java虚拟机就可以加载执行这些Class文件。...Class文件的内容。...上面这张图是经过编译后的Class文件中的内容 魔数(magic)与版本号 Class文件开头固定的4个字节为魔数,唯一作用就是用来确定这个文件是否是一个能被虚拟机接收的class文件。...文件,但是不能运行以后版本的Class文件,通俗一点将就是向下兼容。...常量池中主要存放两大类常量: 字面量 符号引用 字面量主要指的是文本字符串、声明为final的常量值等 符号引用主要包含三类常量: 类和接口的全限定名 字段的名称和描述符 方法的名称和描述符 Java代码在编译的时候不存在连接时
class文件是一组以8位字节为基础单位的二进制流组成的。...大部分的文件都会使用魔数来进行文件识别,比如一般我们看到gif、jpeg等格式的文件就知道这是个图片。但是呢,程序识别文件类型却不是根据文件扩展名而是根据魔数来的。...class文件的魔数是0xCAFEBABE,Java虚拟机判断一个文件是否是class文件就是依靠此魔数进行的。...java虚拟机可以运行低于当前版本的class文件,但不能运行高于其版本的class文件。...没有使用的标志位和不符合条件的标志位一律为0 类索引 类索引占两个字节,指向常量池中的CONSTANT_Class_info类型的常量,这个类型的常量中包含一个指向全限定名常量项的索引。
StandardFilemanager this.stdManager = compiler.getStandardFileManager(null, null, null); 3 编写核心方法: /** * Compile a Java...* * @param fileName * Java file name, e.g...."Test.java" * @param source * The source code as String....* @return The compiled results as Map that contains class name as key, * class binary as
上一篇Java Class文件格式详解 讲解了整个Class文件的组成部分,因为篇幅的原因没做太多过细的分析,今天我们重点分析下常量池。...); conn.close(); }catch (Exception ex){ } } /** * 将内容保存到文件之中...file.exists()) { file.createNewFile(); } //保存文件...上一篇文章讲了常量池总共17(上一篇写的是18,修正一下,因为2没有使用)种类型,我们来分析其中最常用的类型。...CONSTANT_InterfaceMethodref; 接下来2字节是005C和005D,表示对应的接口名的索引为92,接口方法描述索引为93,因为我们有这么一段代码: pst.addBatch(sql); 92和93索引联合的内容为:java
根据 Java 虚拟机规范,类文件由单个 ClassFile 结构组成: ClassFile { u4 magic; //Class 文件的标志...高版本的 Java 虚拟机可以执行低版本编译器生成的 Class 文件,但是低版本的 Java 虚拟机不能执行高版本编译器生成的 Class 文件。...字面量比较接近于 Java 语言层面的的常量概念,如文本字符串、声明为 final 的常量值等。而符号引用则属于编译原理方面的概念。...上述这些信息中,各个修饰符都是布尔值,要么有某个修饰符,要么没有,很适合使用标志位来表示。而字段叫什么名字、字段被定义为什么数据类型这些都是无法固定的,只能引用常量池中常量来描述。...与 Class 文件中其它的数据项目要求的顺序、长度和内容不同,属性表集合的限制稍微宽松一些,不再要求各个属性表具有严格的顺序,并且只要不与已有的属性名重复,任何人实现的编译器都可以向属性表中写 入自己定义的属性信息
一、Class文件概述 Java编写的程序可以运行在许多平台上,平台无关性的基础是虚拟字节码和字节码存储格式,Java虚拟机不和Java语言强绑定,它只和Class文件打交道,即加载Class...至于编写的语言可以是Java、Colin甚至其它任何可以产生Class文件的语言。而Class文件对应的就是字节码的持久化表示。...学习Class文件格式有助于我们了解Java虚拟机类加载机制,从而加深对虚拟机的了解。 二、Class文件组成 接下来的分析都是基于JDK8环境,包括代码和具体的格式。 ?...、属性信息 具体格式: 先是2字节的属性个数; 接下来是具体的属性,每一项的格式如下: 名称 长度 说明 名称索引 2 常量池中索引 属性长度 4 属性值 属性长度 常用的属性有: 属性名称 使用位置...三、解析代码 上面整个分析过程还是蛮抽象的,如果有兴趣的同学建议可以对着代码看加深理解,整个Class文件的解析主要在ClassFile这个类中,它的命名空间为com.sun.tools.classfile
1.源代码 class FangFaDemo{ public static void main(String[] args){ int x = 1 , y = 2;...sum(x,y)); } } public static int sum(int a,int b){ return a+b; } 2.报错信息 3.问题分析 显示的是sum方法需要class...,重新检查了一下,发现是class的大括号没有把sum方法包括起来 4.问题解决 将大括号的位置更正即可成功编译 class FangFaDemo{ public static void main...sum(x,y)); } //原位置 public static int sum(int a,int b){ return a+b; } }//把原位置的大括号移动到这里来 编译结果...: 5.补充 class是类 interface是接口 enum是枚举 class等关键字需要首写小写 源文件中必须有一个public 的类名与文件名一致 发布者:全栈程序员栈长,转载请注明出处:https
Java指令编译java文件 1. 进入cmd 2. 编译 2.1 切换不同JDK编译文件 3. 运行 1....这时候就会多出.class文件,就是字节码文件了。...2.1 切换不同JDK编译文件 一般JDK配置好了,直接用javac编译即可 Java环境配置/JDK安装配置 如果安装了多个JDK那怎么办呢?...UTF-8 编译文件.java 这时候会发现类文件具有错误的版本 55.0, 应为 51.0 Java对应的major version版本号 是因为你之前用另一个JDK编译过了, 此时变了版本...删除所有.class文件命令: del *.class 编译通过 3.
JDK1.5编译的(JDK1.5:0x0031,JDK1.6:0x0032,JDK1.7:0x0033) 高版本的JDK可以向下兼容以前版本的Class文件,但是无法运行以后版本的Class文件,即使文件格式并未发生变化...如果使用JDK1.5运行使用JDK1.6编译的Class文件,会报: java.lang.UnsupportedClassVersionError: Bad version number in .class...file 就是由于JDK1.6编译的文件版本号超过了JDK1.5虚拟机所接受的范围 Java class文件是二进制文件。...为了便于理解它,JVM提供者提供了javap,反汇编器(编译,反编译的本质,是“映射”)。 一切皆是映射(光剑) 使用javap产生的结果是Java汇编语言。...官网文档: The Java Virtual Machine class file format class文件时java虚拟机执行引擎的数据入口,也是java技术体系的基础支柱之一,了解class文件的结构对后面进一步了解虚拟机执行引擎有很重要的意义
领取专属 10元无门槛券
手把手带您无忧上云