Java字节码文件结构---概述】的更多相关文章

一.Class文件的结构概述: 是一连串的字节流(以自节为基本单位划分),里面包含的数据项按照固定的次序依次排列组成Class文件,文件内部不含分割符 当数据项的长度大于1B时候,按照高位在前的方式存储数据项.数据项是被严格定义的不允许被修改. 整个字节码文件由两种数据结构组成: 1.无符号数:用来表示基本数据类型 2.表:是由无符号书组成的复杂数据结构 二.Class文件具体包含的内容 1.头4B:表示Class文件是否可以被JVM识别 2 .4B:class文件使用的JDK版本信息 3.常量…
很多时候,我们都是从代码层面去学习如何编程,却很少去看看一个个 Java 代码背后到底是什么.今天就让我们从一个最简单的 Hello World 开始看一看 Java 的类文件结构. 在开始之前,我们先写一个最简单的入门 Hello World. public class Demo{ public static void main(String args[]){ System.out.println("Hello World."); } } 接着在命令行运行javac Demo.jav…
今天起开启JVM的新的知识学习篇章----Java的字节码,那学习Java字节码有啥用呢?我们知道Java是跨平台的一门语言,编写一次到处运行,而支撑着这个特性的根基为两点:JVM和.class字节码文件,java在不同的平台上编译生成的.class文件是一模一样的,而JVM针对不同的操作系统会有不同的JVM,也就是JVM其实并非是跨平台的,而生成的.class文件其实是一个二进制文件,该文件并非是给人看的,而是给机器看的,所以肯定是看不懂的,但是针对字节码JVM是有规范定义的,而如今基于JVM…
Java字节码文件查看 我们有一个类Test01,具体内容如下: package bytecode; public class Test01 { private int i = 0; public int getI() { return i; } public void setI(int i) { this.i = i; } } 编译这个类,得到Test01.class文件 IDE查看 用IDEA编译器查看 我们发现查看到的class文件与类文件基本相同,这是因为IDE自带的Fernflower…
温馨提示:此篇文章长达两万字,图片50多张,内容非常多,建议收藏后再看. 前面我们说到 Java 虚拟机使用字节码实现了跨平台的愿景,无论什么系统,我们都可以使用 Java 虚拟机解释执行字节码文件.但其实字节码是有一套规范的,而规定字节码格式的就是<Java 虚拟机规范>.<Java 虚拟机规范>规定了 Java 虚拟机结构.Class 类文件结构.字节码指令等内容.其中类文件结构是有必要了解的一个内容. 字节码文件结构是一组以 8 位字节为基础的二进制流,各数据项目严格按照顺序…
笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.csdn.net/qq_35925558/NOTE_JVM https://github.com/uxiahnan/NOTE_JVM 目录 Class文件结构 1. Class字节码文件结构 2. Class文件数据类型 3. 魔数 4. 文件版本号 4.1. Class文件版本号对应关系 5. 常量池…
要理解 Java 字节码,比较推荐的方法是自己尝试编写源码对照字节码学习.其中阅读 Java 字节码的工具必不可少.虽然javap可以以可读的形式展示出.class 文件中字节码,但每次改动源码都需调用命令行并不方便.这里介绍一个可以辅助阅读 Java 字节码的 Eclipse 插件:bytecode outline. bytecode outline 插件用可读的方式展现了 Eclipse 的 Java 编辑器或类文件的字节码内容.它使用了 ASM 框 架的部分组建来实现对字节码的展示(ASM…
Java字节码指令 Java 字节码指令及javap 使用说明 ### java字节码指令列表 字节码 助记符 指令含义 0x00 nop 什么都不做 0x01 aconst_null 将null推送至栈顶 0x02 iconst_m1 将int型-1推送至栈顶 0x03 iconst_0 将int型0推送至栈顶 0x04 iconst_1 将int型1推送至栈顶 0x05 iconst_2 将int型2推送至栈顶 0x06 iconst_3 将int型3推送至栈顶 0x07 iconst_4…
要理解 Java 字节码,比较推荐的方法是自己尝试编写源码对照字节码学习.其中阅读 Java 字节码的工具必不可少.虽然javap可以以可读的形式展示出.class 文件中字节码,但每次改动源码都需调用命令行并不方便.这里介绍一个可以辅助阅读 Java 字节码的 Eclipse 插件:bytecode outline. bytecode outline 插件用可读的方式展现了 Eclipse 的 Java 编辑器或类文件的字节码内容.它使用了 ASM 框 架的部分组建来实现对字节码的展示(ASM…
原文链接:http://www.blogjava.net/DLevin/archive/2011/09/05/358033.html 小介:去年在读<深入解析JVM>的时候写的,记得当时还想着用自己的代码解析字节码的,最后只完成了一部分.现在都不知道还有没有保留着,貌似Apache有现成的BCEL工程可以做这件事.当时也只是为了学习.这份资料主要参考<深入解析JVM>和<Java虚拟机规范>貌似是1.2版本的,整理出来的.里面包含了一些自己的理解和用实际代码的测试.有兴…
原文出处: jaffa 很多时候我们在编写Java代码时,判断和猜测代码问题时主要是通过运行结果来得到答案,本博文主要是想通过Java字节码的方式来进一步求证我们已知的东西.这里没有对Java字节码知识进行介绍,如果想了解更多的Java字节码或对其感兴趣的朋友可以先阅读字节码基础:JVM字节码初探. String字面量可以通过’==’判断两个字符串是否相同,是因为大家都知道’==’是用来判断两个对象的值引用地址是否一致,两个值一样的字符串字面量定义是否指向同一个值内存地址呢?答案是肯定的. 1…
Java是一门设计为运行于虚拟机之上的编程语言,因此它需要一次编译,处处运行(当然也是一次编写,处处测试).因此,安装到你系统上的JVM是原生的程序,而运行在它之上的代码是平台无关的.Java字节码就是你写的源代码的中间表现形式,也就是你的代码编译后的产物.你的class文件就是字节码. 简单点说,字节码就是JVM使用的代码集,它在运行时可能会被JIT编译器编译成本地代码. 你玩过汇编语言或者机器代码吗?字节码就是类似的东西,不过业界中许多人也很少会用及它,因为基本没这个必要.然而它对于理解程序…
本文主要内容: ASM是什么 JVM指令 Java字节码文件 ASM编程模型 ASM示例 参考资料汇总 JVM详细指令 ASM是什么 ASM是一个Java字节码操纵框架,它能被用来动态生成类或者增强既有类的功能.ASM可以直接产生二进制class文件,也可以在类被加载入Java虚拟机之前动态改变类行为.Java class被存储在严格格式定义的.class文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称.方法.属性以及 Java 字节码(指令).ASM从类文件中读入信息后,能够改变…
今天看到一道面试题,i++和++i的效率谁高谁低. 面试题的答案是++i要高一点. 我在网上搜了一圈儿,发现很多回答也都是同一个结论. 如果早个几年,我也会认同这个看法,但现在我负责任的说,这个结论是错的. i++和++i的效率完全一致,包括i+=1,i=i+1,这几个的效率,完全一致. 来看一段源码: public void test1() { int i = 0; int x = i++; System.out.println(x); } public void test2() { int…
前言 ASM 是什么 官方介绍:ASM is an all purpose Java bytecode manipulation and analysis framework. It can be used to modify existing classes or dynamically generate classes, directly in binary form. ASM是一个多用途的Java字节码操作和分析框架.它可以被用来修改现有类或动态生成的类,直接以二进制形式 ASM 应该是…
简介 本文示范了一种反编译Java字节码的方法,首先通过解析class文件,然后将解析的结果转成java代码.但是本文并没有覆盖所有的class文件的特性和指令,只针对部分规范进行解析. 所有的代码代码都是示范性的,追求功能实现,没有太多的软件工程方面的考量. 解析Class文件 本节定义一系列数据结构用来将二进制class数据用java代码来描述.并简述一些基本概念,由于class文件定义项非常多,如果要详细了解,请查看<ava虚拟机规范> [https://docs.oracle.com/…
原文链接:http://it.deepinmind.com/jvm/2014/05/24/mastering-java-bytecode.html Java是一门设计为运行于虚拟机之上的编程语言,因此它需要一次编译,处处运行(当然也是一次编写,处处测试).因此,安装到你系统上的JVM是原生的程序,而运行在它之上的代码是平台无关的.Java字节码就是你写的源代码的中间表现形式,也就是你的代码编译后的产物.你的class文件就是字节码. 简单点说,字节码就是JVM使用的代码集,它在运行时可能会被JI…
如下,是一些java字节码也就是原始的class文件,当应用部署到线上之后,我们能够看到的也就是这样的字样了.那么怎样解呢?就让我们一起,来解读解读字节码吧! Offset A B C D E F CA FE BA BE 6A 0A 1C 0A 漱壕 j 3A 3B 3C 3D : ; < = 3E 0A 3F 0A > ? @ A 0A 0A 0A B C D 0A 0A 0A 0A E F G H I 0A 0A 4A 0B 4B 4C 4D 0A J K L M 0A 4E 4F 0A…
什么是java字节码? java字码是java源程序代码的一种较为低级的表示.Java编译器将源代码编译成字码后,就可以Java解释器执行…
英文原文链接,译文链接,原文作者:James Bloom,译者:有孚 条件语句 像if-else, switch这样的流程控制的条件语句,是通过用一条指令来进行两个值的比较,然后根据结果跳转到另一条字节码来实现的. 循环语句包括for循环,while循环,它们的实现方式也很类似,但有一点不同,它们通常都会包含一条goto指令,以便字节码实现循环执行.do-while循环不需要goto指令,因为它的条件分支是在字节码的末尾.更多细节请参考循环语句一节. 有一些指令可以用来比较两个整型或者两个引用,…
  一.什么是ASM ASM是一个java字节码操纵框架,它能被用来动态生成类或者增强既有类的功能.ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为.Java class 被存储在严格格式定义的 .class文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称.方法.属性以及 Java 字节码(指令).ASM从类文件中读入信息后,能够改变类行为,分析类信息,甚至能够根据用户要求生成新类. 使用ASM框架需要导入asm的jar包,下载链…
一个一直运行正常的应用突然无法运行了.在类库被更新之后,返回下面的错误. Exception in thread "main" java.lang.NoSuchMethodError: com.nhn.user.UserAdmin.addUser(Ljava/lang/String;)V at com.nhn.service.UserService.add(UserService.java:14) at com.nhn.service.UserService.main(UserServ…
Reference javap 基本使用方法 深入理解java字节码 从Java代码到字节码 Java字节码.class文件案例分析 字节码 核心概念 Class文件是8位字节流,按字节对齐.之所以称为字节码,是由于每条指令都仅仅占领一个字节.全部的操作码和操作数都是按字节对齐的. 数据结构 Java虚拟机规范中规定.Class文件格式採用一种相似C语言结构体的伪结构来存储,它仅仅有两种数据类型 无符号数(基本数据类型) 主要用于描写叙述数字.索引引用.数量值.或UTF-8编码构成的字符串: u…
JVM 内部原理(七)- Java 字节码基础之二 介绍 版本:Java SE 7 为什么需要了解 Java 字节码? 无论你是一名 Java 开发者.架构师.CxO 还是智能手机的普通用户,Java 字节码都在你面前,它是 Java 虚拟机的基础. 总监.管理者和非技术人员可以放轻松点:他们所要知道的就是开发团队在正在进行下一版的开发,Java 字节码默默的在 JVM 平台上运行. 简单地说,Java 字节码是 Java 代码(如,class 文件)的中间表现形式,它在 JVM 内部执行,那么…
JVM 内部原理(六)- Java 字节码基础之一 介绍 版本:Java SE 7 为什么需要了解 Java 字节码? 无论你是一名 Java 开发者.架构师.CxO 还是智能手机的普通用户,Java 字节码都在你面前,它是 Java 虚拟机的基础. 总监.管理者和非技术人员可以放轻松点:他们所要知道的就是开发团队在正在进行下一版的开发,Java 字节码默默的在 JVM 平台上运行. 简单地说,Java 字节码是 Java 代码(如,class 文件)的中间表现形式,它在 JVM 内部执行,那么…
背景 项目维护的时候版本混乱或者外出在现场项目排错的时候难免要比对两个jar/class/war文件的源代码. 通常情况下这个时候我们用jd-gui直接把文件拖进去比对,这种情况只适合单一文件的比对. 如果一个lib目录下有很多jar或者class文件要比对,这个时候工作量就比较大了. 笔者去年这个时候在网络上研究了一番,找到了一个可以批量反编译的中间件,后来写了一遍文章CFR - another java decompiler批量反编译jar文件. 这个可以批量反编译,具体移步看那篇文章.在以…
java字节码 计算机只认识0和1.这意味着任何语言编写的程序最终都需要经过编译器编译成机器码才能被计算机执行.所以,我们所编写的程序在不同的平台上运行前都要经过重新编译才能被执行. 而Java刚诞生的时候曾经提过一个非常著名的宣传口号: "一次编写,到处运行". Write Once, Run Anywhere. 为了实现该目的,Sun公司以及其他虚拟机提供商发布了许多可以运行在不同平台上的JVM虚拟机,而这些虚拟机都拥有一个共同的功能,那就是可以载入和执行同一种与平台无关的字节码(…
前言 随着Java开发技术不断被推到新的高度,对于Java程序员来讲越来越需要具备对更深入的基础性技术的理解,比如Java字节码指令.不然,可能很难深入理解一些时下的新框架.新技术,盲目一味追新也会越来越感乏力. 本文既不求照本宣科,亦不求炫技或著文立说,仅力图以最简明.最形象生动的方式,结合例子与实战,让小白也能搞懂这门看似复杂的技术概念. 单刀直入 闲言碎语不要讲,先表一表,什么是Java字节码指令?简而言之,Java字节码指令就是Java虚拟机能够听得懂.可执行的指令,可以说是Jvm层面的…
在Sun公司提供的JDK中,就已经内置了Java字节码文件反编译工具javap.exe(位于JDK安装目录的bin文件夹下). 我们可以在dos窗口中使用javap来反汇编指定的Java字节码文件.在使用javap的相关dos命令之前,你必须确保已经将JDK安装目录\bin添加到环境变量path中. 接着,我们就可以使用javap来反编译指定的Java字节码文件了.在此之前,我们先通过javap的帮助命令javap -help查看javap相关指令的用法. C:\Users\winner_071…
Java字节码 javap -c 反编译.class文件可得字节码 知乎讨论https://www.zhihu.com/question/27831730 栈和局部变量操作 将常量压入栈的指令 aconst_null 将null对象引用压入栈 iconst_m1 将int类型常量-1压入栈 iconst_0 将int类型常量0压入栈 iconst_1 将int类型常量1压入栈 iconst_2 将int类型常量2压入栈 iconst_3 将int类型常量3压入栈 iconst_4 将int类型常…