我试图了解.class文件如何在
java中工作以及它们的用途是什么.我在网上找到了一些信息,但我得到了不满意的解释.
一旦我们运行编译器,我们就会得到.class文件,它是字节码.这台机器是否可读?如果没有,这就是为什么我们需要程序的解释器才能成功运行?
此外,由于.class文件相当于我们的.java程序,为什么有人不能通过使用VM运行.class文件直接运行java程序,他们也需要有.java文件?
解决方法
根据定义,JVM是一个
virtual machine,它是一个模拟真机操作的软件机器.像真机一样,它有一个
instruction set(
bytecodes),一个虚拟计算机架构和一个执行模型.它能够运行用这个虚拟指令集编写的代码,就像真机可以运行机器代码一样.
因此,类文件包含虚拟指令集中的指令,并且能够运行它们.就此而言,虚拟机可以解释代码本身,也可以针对当前运行的硬件架构进行编译.有些人做两件事,有些做其中一件.
例如,Java HotSpot最初解释字节码,并逐步将代码编译为机器代码.这称为adaptive optimization.某些虚拟机始终直接编译为机器代码.
所以,你可以看到有两种不同的“编译概念”.一个是将Java代码转换为JVM字节码(从.java到.class).当程序运行时会发生第二个编译阶段,其中字节码可以被解释或编译为实际的机器代码.这是由JVM内的just-in-time compiler完成的.
因此,正如您所看到的,计算机无法直接运行Java程序,因为该程序不是用计算机理解的语言编写的.它用语言编写,所有JVM实现都可以理解.并且有许多操作系统和硬件架构的JVM实现.这些JVM使用此通用语言(字节码)转换任何特定硬件(机器代码)的程序.这就是虚拟机的美妙之处.