精华内容
下载资源
问答
  • 要想使Java运行,我们可以设计一个...本篇要带来的是Java字节码中jvm的使用,主要分为两个操作视角,一起来看看具体内容吧。1、虚拟机视角在执行Java代码时,首先需要将编译后的class文件装入Java虚拟机。装入的J...

    要想使Java运行,我们可以设计一个面向Java语言特性的虚拟机,并通过编译器将Java程序转换为它可以识别的指令序列,也称为Java字节码。由于Java字节码指令的操作码被固定为一个字节,所以它的名字就这样命名了。本篇要带来的是Java字节码中jvm的使用,主要分为两个操作视角,一起来看看具体内容吧。

    1、虚拟机视角

    在执行Java代码时,首先需要将编译后的class文件装入Java虚拟机。装入的Java类将存储在方法区(MethodArea)中。虚拟机会在实际运行时执行方法区内的代码。JavaVirtualMachines将堆和栈分割为内存,以存储运行时数据。JavaVirtualProfessional将栈细分为面向Java方法的Java方法栈、面向本地方法(用C++写的native方法)的本地方法栈和存放各个线程执行位置的PC寄存器。

    该调用将进入Java方法,而Java虚拟机会将在当前线程的Java方法栈中生成用于存储本地变量和字节码操作数的栈帧。该栈帧的大小是事先计算好的,并且Java虚拟机不需要连续地在内存空间中分布栈帧。Java虚拟机在退出当前执行的方法时,无论是正常还是异常,都将弹出当前线程的当前栈帧,并放弃该帧。

    2、硬件视角

    Java字节代码不能直接执行,因此Java虚拟机需要将字节代码翻译成机器代码。在HotSpot中,翻译过程有两种形式

    1、是说明执行,把字节代码翻译成机器代码执行

    2、是即时编译(Just-In-Timecompilation、JIT),将一种方法包含的所有字节代码编译成机器代码后执行。

    前者的优势是不需要等待编译,后者的优势是实际运行速度更快。

    知识点扩充:

    作为一个Java开发者,对技术的追求而不仅仅停留在会用API,会写基本功能上,要想在技术上有更高的造诣,就需要深入到原理层面去认识代码运行的机制。因此,本文从class字节码文件的结构入手,一步步来解剖二进制字节码的内部工作原理,这对深入理解JVM的运行机制大有裨益,同时,对于想要使用BCEL来动态改变Class字节码指令的工作也很有帮助(示例:JVM Class字节码之三-使用BCEL改变类属性)。

    什么是Class文件

    Java字节码类文件(.class)是Java编译器编译Java源文件(.java)产生的“目标文件”。它是一种8位字节的二进制流文件, 各个数据项按顺序紧密的从前向后排列, 相邻的项之间没有间隙, 这样可以使得class文件非常紧凑, 体积轻巧, 可以被JVM快速的加载至内存, 并且占据较少的内存空间(方便于网络的传输)。

    Java源文件在被Java编译器编译之后, 每个类(或者接口)都单独占据一个class文件, 并且类中的所有信息都会在class文件中有相应的描述, 由于class文件很灵活, 它甚至比Java源文件有着更强的描述能力。

    class文件中的信息是一项一项排列的, 每项数据都有它的固定长度, 有的占一个字节, 有的占两个字节, 还有的占四个字节或8个字节, 数据项的不同长度分别用u1, u2, u4, u8表示, 分别表示一种数据项在class文件中占据一个字节, 两个字节, 4个字节和8个字节。 可以把u1, u2, u3, u4看做class文件数据项的“类型” 。

    到此这篇关于Java字节码中jvm实例用法的文章就介绍到这了,更多相关Java字节码中jvm的使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    展开全文
  • 小李:JVM(Java Virtual Machine) Java 虚拟机,用于运行 Java 编译后的二进制字节码,最后生成机器指令。(心里一想,简简单单)面试官:那为什么 Java 研发体系需要 JVM?你对 JVM 的运行原理了解多少?我们写的 ...

    什么是 JVM?

    面试官:什么是 JVM?

    小李:JVM(Java Virtual Machine)是 Java 虚拟机,用于运行 Java 编译后的二进制字节码,最后生成机器指令。(心里一想,简简单单)

    面试官:那为什么 Java 研发体系需要 JVM?你对 JVM 的运行原理了解多少?我们写的 Java 代码到底是如何运行起来的?

    小李:嗯。。。就是。。。嗯。。。是那个。。。嗯。。。

    面试官:面试就到这里了,先回去等通知吧。

    小李:好的!(哭着回答)

    这里面试官对小李进行三连问:为什么 Java 研发体系需要 JVM?

    你对 JVM 的运行原理了解多少?

    我们写的 Java 代码到底是如何运行起来的?

    这套组合拳看似很厉害,其实就是军体拳。

    如果想完美的练这套军体拳,不,是完美的回答这三个问题,就需要首先要了解 JVM 是什么?它和 Java 是什么关系?又和 JDK 有什么渊源?那要弄清楚这些问题,就需要从三个维度去思考:JVM 和操作系统的关系;

    JVM 、JRE、JDK 的关系;

    Java 虚拟机规范和 Java 语言规范的关系。

    弄清楚这这几者的关系,我们再通过一个简单代码示例来看一个 Java 程序到底是如何执行的。

    JVM 和 操作系统的关系

    我们知道炼制一把牛逼的大宝剑,不仅需要上等的技术,还需要一鼎经百炼的剑炉。而工程师就相当于铸剑的剑师,JVM 便是剑炉。

    JVM 就是我们耳熟能详的 Java 虚拟机。它能识别 .class 后缀文件,并且能够解析它的指令,最终调用操作系统上的函数,完成我们想要的操作。

    Java 程序和 C++ 程序有什么不同呢?这里用两张图进行说明。

    对比两张图可以看到 C++ 开发的程序可以翻译成操作系统能识别的 .exe 文件。而 Java 程序需要通过 javac 编译成 .class 文件之后,然后由 JVM 负责调用系统函数执行程序,操作系统并不认识 .class 文件。

    那读者就劝小李了,转 C++ 开发吧,这 Java 还搞了一个处于程序和操作系统的虚拟机,不像 C++ 编译后直接在操作系统上运行,肯定不是啥好玩意。

    我就知道你们坏的很,知道 JVM 的过人之处,还不告诉小李。那我给小李讲讲 JVM 的过人之处:

    Java 是一门抽象度特别高的语言,提供了自动内存管理等一系列的特性。这些特性在操作系统上基本上是无望了,所以就需要 JVM 进行一番转换。

    经过上面的介绍,我们可以做如下的类比:JVM:等同于操作系统;

    Java 字节码:等同于汇编语言。

    Java 字节码还是比较容易读懂,从侧面上也证明了 Java 语言的抽象程度高。我们可以认为 JVM 是一个翻译器,会持续不断的翻译执行 Java 字节码,然后调用真正的操作系统函数,这些操作系统函数是与平台息息相关的。可以把 JVM 想象一个有道词典,.class 文件是英文,而输出的结果是中文。有道词典有 windows版本,也有 Linux 版本,内部具体的实现肯定不同,但最终都会得到相同的结果,这样就好理解一些了)

    当有个 JVM 这个抽象层,就可以实现跨平台了。JVM 只需要正确执行 .class 文件,就可以运行在 Linux、Windos、MacOS 等平台了。

    Java 跨平台的意义在于一次编译,处处运行,这里 JVM 功不可没。比如在 Maven 仓库下载的 jar 包就可以到处运行,不需要在每个平台上再编译一次。

    我们来概括 JVM 与操作系统之间的关系:JVM 上承开发语言,下接操作系统,它的中间接口就是字节码。

    JVM、JRE、JDK 的关系

    通过上面的学习,我们了解到 JVM 是 Java 程序能够运行的核心。但是我们要知道,JVM 自己什么也干不了,你需要给它提供原料(.class 文件)。俗话说:巧妇难为无米之炊。JVM 功能虽然强大,但还是需要为它提供 .class 文件。

    但是仅靠 JVM 是无法完成一次编译,到处运行的。它需要一个基本的类库,比如怎么操作文件、怎么连接网络、怎么教你出拳(小李已疯)等。而 Java 体系会一次性将 JVM 运行所需的类库都传递给它。JVM 标准加上基本类库就组成了 Java 的运行环境,就是 JRE (Java Runtime Enviroment)JVM + 基本类库 = JRE

    那 JDK 又是什么呢?

    JDK 全称 Java Development Kit,Kit 是装备的意思。所以 JDK 不仅包含 JRE,还有一些小工具,比如 javac、java、jar等。JRE + javac/java/jar 等指令工具 = JDK

    JVM、JRE、JDK 它们三者之间的关系,可以用一个包含关系表示。JDK > JRE > JVM

    Java 虚拟机规范和 Java 语言规范的关系

    从广义上来讲,JVM 是一种规范,它是最为官方、准确的文档;狭义上来讲,由于我们使用 Hotspot 更多一些,所以我们在谈到这个概念时,会将他们等同起来。

    如果再加我们平常使用的 Java 语言,可以得到下面一张图。

    左边是 Java 虚拟机规范,为字节码的解析提供一个环境。右边是 Java 语法规范,比如 switch、for、泛型、lambda 等相关的程序,最终都会编译成字节码。而字节码是链接左右两部分的桥梁。

    如果 .class 文件的规格是不变的,这两部分是可以独立进行优化的。But 没有如果,现在都已经到 Java 13 了,为了支持更多的特性,肯定会增加一些字节码指令。

    此刻优秀的小李提出了一个让人深思的问题:如果我不学习 JVM,会影响我写 Java 代码么?

    理论上,这两者没有必然的联系。他们之间通过 .class 文件进行交互,即使你不了解 JVM,也能够写大多数的 Java 代码。就像你是写 C++ 代码一样,并不需要特别深入的了解操作系统的底层是如何实现的。

    那我还学个锤子!瞬间关了该页面。

    客官别走,还有但是没说呢。

    但是,如果你想要写一些比较精巧、效率比较高的代码,就需要了解一些执行层面的知识了。了解 JVM,主要用在调优以及故障排查上面,你会对运行中的各种资源分配,有一个比较全面的掌控。(是不是内心还有点小期待呢!)

    Java 代码到底是如何运行起来的

    最后,我们简单看一下 Java 程序的执行过程,了解下它到底是如何运行起来的。

    这里的 Java 程序是文本格式的。比如下面这段 HelloXiaoli.java,它遵循的就是 Java 语言规范。其中,我们调用的 System.out 等模块,就是 JRE 提供的类库。

    通过 JDK 的工具 javac 进行编译后,就会产生 HelloWorld 的字节码。

    1javac HelloXiaoli.java

    Java 字节码是沟通 JVM 和 Java 程序的桥梁,下面使用 javap 来看一下字节码到底长什么样子。

    javap -verbose HelloXiaoli.class

    0 getstatic #2

    3 ldc #3

    5 invokevirtual #4

    8 return

    Java 虚拟机采用基于栈的架构(为什么基于栈的架构详见:

    我们继续使用 hexdump 看一下字节码的二进制内容

    b2 00 02 12 03 b6 00 04 b1

    我们可以看一下它们的对应关系。

    0xb2 getstatic 获取静态字段的值

    0x12 ldc 常量池中的常量值入栈

    0xb6 invokevirtual 运行时方法绑定调用方法

    0xb1 return void 函数返回

    opcode 是一个字节的长度(0~255),意味着指令集的操作码个数不能超过 256 条。紧跟在 opcode 后面的是被操作数。比如 b2 00 02,就代表了 getstatic #2 。

    JVM 就是靠解析这些 opcode 和 操作数来完成程序的执行的,当我们使用 Java 命令运行 .class 文件的时候,实际上就相当于启动了一个 JVM 进程。

    JVM 会翻译这些字节码,它有两种执行方式:解释执行,将 opcode + 操作数翻译成机器代码;

    JIT,即时编译,它会在一定条件下将字节码翻译成机器码之后再执行。

    .class 文件会被加载、存放到 metaspace 中,等待被调用,这里会有一个类加载器的概念。

    JVM 的程序运行,都是在栈上完成的,这和其他普通程序的执行是类似的,分为堆和栈。比如我们程序运行到了 main 方法,就会给它分配一个栈帧。当推出方法体时,会弹出相应的栈帧。其实,大多数字节码指令,就是不断的对栈帧进行操作。

    而其它大块数据,是存放在堆上的。Java 在内存划分上会更为细致,关于这些概念,会在后面的章节中详细介绍。

    我们看下面的图,JVM 部分是我们系列需要讲解的部分。

    小结

    上面讲了这么多,让我们再回头看看面试官提问的三个问题。为什么 Java 研发系统需要 JVM?

    因为 Java 是一门抽象的语言,并且有自动内存管理机制。而操作系统无法去进行自动垃圾回收等操作,所以就有了虚拟机。虚拟机可以对字节码加载、自动垃圾回收、并发等。而 JVM 只是一个规范,定义了 .class 文件的结构、加载机制、数据存储、运行时栈等诸多内容,最常用的 JVM 实现就是 Hotspot。你对 JVM 的运行原理了解多少?

    JVM 的生命周期是和 Java 程序的运行一样,当程序运行结束,JVM 实例也就跟着消失了。具体的运行原理,会在后续文章中详细介绍,请关注小李哦!我们写的 Java 代码到底是如何运行起来的?

    Java 程序通过 javac 编译成 .class 文件,然后虚拟机将其加载到元数据区,执行引擎将会通过混合模式执行这些字节码。执行时,会翻译成操作系统相关的函数。

    过程如下:Java 文件->编译器->字节码->JVM->机器码

    总结

    本篇文章从三个角度了解了 JVM 在 Java 研发体系中的位置,并以一个简单的程序,看了下一个 Java 程序的执行过程。

    我们说的 JVM,狭义上指的就是 HotSpot。如果没有特殊说明,我们都以 HotSpot 为准。

    我们知道 Java 之所以跨平台,就是由于 JVM 的存在。Java 的字节码,是沟通 Java 语言与 JVM 的桥梁,同时也是沟通 JVM 与操作系统的桥梁。

    JVM 是一个非常小的集合,我们常说的 Java 运行时环境,也就是 JRE 包含 JVM 和一部分基础类库。如果加上我们常用的一些开发工具,就构成了整个 JDK。

    Java 虚拟机栈采用基于栈的架构,有比较丰富的 opcode。这些字节码可以解释执行,也可以编译成机器码,运行在底层硬件上,可以说 JVM 是一种混合执行的策略。

    留两道思考题给大家:栈上都会有哪些数据?

    垃圾回收会发生在什么地方?

    思考题我会在后面的章节为大家一一解答。

    记得关注公众号:小李不秃

    学 Java 就是如此简单。

    展开全文
  • 为什么java字节码解释器叫虚拟机,而像python的却只叫解释器 因为jvm在设计上按一台真正的机器去设计,可以解析一系列指令,类似于汇编指令。而python虽然也有编译器然后生成中间代码但是它不是按照一台真正的...

    为什么java的字节码解释器叫虚拟机,而像python的却只叫解释器

    因为jvm在设计上按一台真正的机器去设计,可以解析一系列指令,类似于汇编指令。而python虽然也有编译器然后生成中间代码但是它不是按照一台真正的机器指令去设计的,脱离了虚拟机它是不能在硬件上直接运行的,而jvm如果要是有硬件可以去解析字节码那么它是可以在硬件上运行的。所以java的字节码解释器叫虚拟机,而像python、php、js等脚本语言却只叫解释器。

    展开全文
  • 为什么要将Java字节码翻译...目前版本的Java大概有200+的字节码指令,其中大部分都1字节指令,这也是为什么叫做字节码。少部分指令多字节或不定长指令。对于解释器来说,解释指令时一般都在操作两个区域。一个...

    为什么要将Java字节码翻译为C代码?

    Java字节码是基于栈的一种编码。这种编码方式十分方便解释器的设计,但同时不利于程序分析,因此一些高效的代码优化技术无法方便的Java字节码上实现。

    先大体说说Java字节码的特点。目前版本的Java大概有200+的字节码指令,其中大部分都是1字节指令,这也是为什么叫做字节码。少部分指令是多字节或不定长指令。

    对于解释器来说,解释指令时一般都是在操作两个区域。一个是栈,一个是局部变量表。举例来说,iload1指令,就是从局部变量表的1号槽位的数据放入操作数栈中,即*stack++ = locals[1]。

    与C或者其他常用的编程语言不同的是,Java字节码的操作数类型是隐含的,操作的类型的显示的,而C语言中操作数类型都是显示的,但是操作是多态的。比如“+”,在C语言中“+”两边的操作数类型可以是int型,可以是double。Java字节码中iadd指令明确表示了要操作相加的两个数一定是int型。但是当抛开iadd指令而直接观测操作数栈时,并不知道栈上操作数的类型。

    直接说结论。

    Java字节码在每一条指令执行时,操作数栈的深度,局部变量表的大小,以及它们上面的操作数类型都是可以确定的。而且,无论从何种路径执行到某一条指令,操作数栈深度及操作数类型都是确定的[1]。Java虚拟机规范的4.10.2章节介绍了字节码校验的一个算法,可以参考。

    以一个简单的a=b+c的例子来说明这个翻译过程。

    对应的Java字节码如下:

    iload1

    iload2

    iadd

    istore1

    我们可以暂时将操作数栈和局部变量表的每一个槽位看成一个局部变量。上面的代码就翻译为:

    s0 = l1;

    s1 = l2;

    s0 = s0 + s1;

    l1 = s0;

    其中局部变量的类型都是已知的。可以看到s0,s1跟Java操作数栈的功能一样,是为了存放临时的计算结果。上面的代码完全可以化简为“l1 = l1 + l2”。但前期没有必要引入这种复杂性,这种化简完全可以由后续的各种优化完成。

    上面的例子实际上的存在一些问题的。虽然Java操作数栈和局部变量表里面存放的数据都是有类型,但是栈和局部变量表本身只是一个存储空间罢了,并没有规定里面必须存放什么类型的数据。所以每次在给栈空间或者局部变量赋值的时候,我们有必要新声明一个局部变量。上面的例子翻译为:

    s0 = l1;

    s1 = l2;

    s0_1 = s0 + s1;

    l1_1 = s0;

    通过数据流分析可以求出def-use,方便做上面的这种变量分裂,这里不详细说了。

    最近在研究Soot,由于Soot的目的是对字节码做优化,所以里面也有将字节码翻译为Jimple的逻辑。但是不明白Soot为什么需要类型推导,目前我感觉将Java字节码翻译为Jimple完全不需要推导类型。

    [1] Toba: Java For ApplicationsA Way Ahead of Time (WAT) Compiler

    展开全文
  • 第一个问题:为什么Java 为什么可以跨平台?和C++ 相比,很重要的一点就是:C++ 编译生成的纯二进制的机器指令,而Java通过编译器编译生成的是非纯二进制的字节码(.class文件)。而这种基于Unicode的字节码是不依赖...
  • 为什么要理解字节码字节码是Java程序的中间表示,就像汇编程序C或C ++程序的中间表示一样。 最有名的C和C ++程序员知道他们要为其编译的处理器的汇编程序指令集。 在调试以及进行性能和内存使用调整时,此...
  • 一、Class文件的结构概述:一连串的字节流(以自节...整个字节码文件由两种数据结构组成:1.无符号数:用来表示基本数据类型2.表:由无符号书组成的复杂数据结构二、Class文件具体包含的内容1.头4B:表示Cla...
  • 我读过一些书,他们将字节码称为二进制指令,但我不知道为什么。参考方案字节码是独立于平台的,在Windows中运行的编译器编译的字节码仍将在linux / unix / mac中运行。机器代码特定于平台的,如果在Windows x86中...
  • 小李:JVM(Java Virtual Machine) Java 虚拟机,用于运行 Java 编译后的二进制字节码,最后生成机器指令。(心里一想,简简单单)面试官:那为什么 Java 研发体系需要 JVM?你对 JVM 的运行原理了解多少?我们写的 ...
  • 一图胜万言 1个十六进制数对应 4 位 二进制数,那么CAFEBABE 一共 8...如果魔数定 0xDE的话,只用 1 个字节就可以搞定啦,可以省点空间,哈哈,不过太容易撞衫了,每个文件格式都会定义自己一套开始的魔数。 ...
  • Class字节码中有两种数据类型:字节数据直接量:这基本的数据类型。共细分为u1、u2、u4、u8四种,分别代表连续的1个字节、2个...Class字节码总体结构如下:我在这里要说明几个细节问题:为什么说常量表的数量c...
  • Java字节码

    2021-01-06 16:52:49
    2、为什么要用字节码 3、怎么用字节码 1、字节码是什么 Java 中字节码英文为bytecode,由单字节(byte)的指令组成,理论上最多支持2的8次方(256)个操作码,但java中只使用200左右的操作码,且这些字节码作为...
  • 如果这真的那么JIT和我的解释器的最终结果应该相同的汇编指令,此时我不明白为什么我需要我的/usr/bin/java解释器.如果我的陈述有任何错误,请更正.最佳答案Java字节码是一种相当高级的语言,与汇编指令的关系远...
  • 字节码是什么? 字节码也可以说是一种语言,或是一种和操作...为什么Groovy语言需要java虚拟机 java虚拟机不是java虚拟机,这句话没在扯淡。因为java虚拟机最初为了给java语言使用的,但是虚拟机设计人员在设计...
  • JAVA字节码

    2017-12-08 21:13:50
    Java程序员应该花费时间去理解什么是字节码,它是怎样工作的,更重要地是,Java编译器产生了什么样的字节码。在某些情况下,产生的字节码并非是你能预料的。 此处关于字节码的信息和提供的字节码都是基于Java 2 ...
  • Java的最初目的是在不依赖特定物理硬件和操作系统环境的情况下运行,这意味着Java程序实现跨平台功能的基石实际上是字节码Java之所以能够解决程序安全性和跨平台可移植性的问题,主要原因在于Java源代码的编译结果...
  • 前言我们在开发中会遇到一些Java的执行超出我们的想象,但是又不知道他为什么会这样执行,这个时候我们就需要能够知道他编译后Class文件什么样子的,并且理解字节码的含义。Java字节码的原理进制class文件就是字节...
  • java语言为什么要先编译为字节码

    千次阅读 2019-05-01 17:56:50
    一直不是很理解,既然Java语言在不同平台编译出的字节码都一样,再由虚拟机将字节码翻译为机器码,那为什么还需要先编译为字节码呢?实现跨平台不都虚拟机的功劳吗? 其实答案很简单——虚拟机读不懂Java程序。 ...
  • 为什么java源码到class字节码是由编译器完成 从java源码到class字节码是由编译器完成的,编译器会对java源码进行解析并生成class文件,而注解也在编译时由编译器进行处理,编译器会对注解符号处理并附加到...
  • 本文作者原创,转载请注明出处...一、什么是Java字节码?借用Algorithm(4th)节选:它程序的一种低级表示,可以运行于Java虚拟机上。将程序抽象成字节码可以保证Java程序在各种设备上的...
  • 1. 字节码1.1 什么是字节码Java之所以可以“一次编译,到处运行”,一是因为JVM针对各种操作系统、平台都进行了定制,二是因为无论在什么平台,都可以编译生成固定格式的字节码(.class文件)供JVM使用。因此,也...
  • java字节码技术

    2020-08-08 15:01:20
    什么是java字节码技术 Java之所以可以“一次编译,到处运行”,一因为JVM针对各种操作系统、平台都进行了定制,二因为无论在什么平台,都可以编译生成固定格式的字节码(.class文件)供JVM使用。因此,也可以...
  • 为什么要将Java字节码翻译...目前版本的Java大概有200+的字节码指令,其中大部分都1字节指令,这也是为什么叫做字节码。少部分指令多字节或不定长指令。对于解释器来说,解释指令时一般都在操作两个区域。一个...
  • 为什么要将Java字节码翻译为C代码? Java字节码是基于栈的一种编码。这种编码方式十分方便解释...目前版本的Java大概有200+的字节码指令,其中大部分都1字节指令,这也是为什么叫做字节码。少部分指令多字节或不...
  • JVM 内部原理(六)— Java 字节码基础之一介绍版本:Java SE 7为什么需要了解 Java 字节码?无论你一名 Java 开发者、架构师、CxO 还是智能手机的普通用户,Java 字节码都在你面前,它 Java 虚拟机的基础。总监、...
  • java字节码

    2020-10-17 16:16:17
    java字节码整体结构 常量池:紧跟着主版本号之后的就是常量池入口。一个java类中定义的很多信息都由常量池来维护和描述的,可以将常量池看作class文件的资源仓库,比如说java类中定义的方法与变量信息,都...
  • 常量池深度剖析: 然后用javap -...先来读一个字节来看一下是什么类型的常量: 查表可以看到属于这个常量: 接着2个字节表示字符串的长度,所以往下数二个字节: 长度4,则下往下数4个字节常量的内容: 用...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,371
精华内容 1,348
关键字:

为什么java是字节码

java 订阅